C 什么';s int*p=&;之间的差异;a和q=&;A.

C 什么';s int*p=&;之间的差异;a和q=&;A.,c,pointers,C,Pointers,学员问题。我可以用两种不同的方式声明和初始化指针 int a = 10; int *p = &a; 也 我想知道两者的区别是什么,以及它在内存中是如何工作的?您的两段代码是等效的-没有区别 通常对于任何类型的T、任何变量名x和任何表达式exp,tx=exp和tx;x=exp彼此等效。第一个是初始化,第二个是赋值。从技术上讲,它们都是非常不同的操作,恰好使用同一个运算符,具有非常不同的含义-在C中,=符号是“重载的” 在这种情况下,它将转化为相同的行为 本标准分别对其进行了定义。在这种

学员问题。我可以用两种不同的方式声明和初始化指针

int a = 10;
int *p = &a;


我想知道两者的区别是什么,以及它在内存中是如何工作的?

您的两段代码是等效的-没有区别


通常对于任何类型的
T
、任何变量名
x
和任何表达式
exp
tx=exp
tx;x=exp彼此等效。

第一个是初始化,第二个是赋值。从技术上讲,它们都是非常不同的操作,恰好使用同一个运算符,具有非常不同的含义-在C中,
=
符号是“重载的”

在这种情况下,它将转化为相同的行为



本标准分别对其进行了定义。在这种情况下,没有区别,但有时也有区别。例如,当对象具有静态存储时,您可以仅将其初始化为文本和常量表达式,而您可以轻松地为其分配其他内容。有更多的差异,归根结底,它们是不同的操作,出于某种原因使用相同的符号。

这两种操作是相同的:

int *p; // declaration
p = &a; // assignment
在另一个步骤中,您将这两个步骤合并为一个步骤:

int *p=&a; // declaration and assignment

如果您有一些编译器优化,编译器可能会将这两个步骤结合起来。

这两种方法没有区别。两者的作用相同。
首先,您在声明时正在初始化。在下一步中,您将推迟初始化。 两者都在做相同的事情,即存储变量“a”的地址。
关于它在记忆中是如何工作的。”a'已分配内存(2/4字节),并将其值存储在此位置。第一个字节的地址使用&a(即a的地址)存储在'p'/'q'中,该地址本身已分配内存。

要使用指针检索值,可以使用*p/*q(即存储在p中的地址处的值)

什么使您认为存在difference@TimCastelijns初始化的语法。我想知道为什么它们是,尽管它们的语法不同。@tintinmj它们是,因为它们是。语法
tfoo=bar
定义为定义一个变量并为其赋值,语法为
T foo;foo=bar被定义为执行相同的操作。这就是语言的定义。除此之外,它是有意义的,也是大多数人所期望的,除此之外,它没有“为什么”。所以记忆没有区别?@tintinmj对,记忆没有区别。“从技术上讲,它们都是非常不同的操作。”你能解释一下技术上的差异吗?@sepp2k我在我的回答中添加了一些解释。
p=&a是一个赋值,而不是初始化。
int*p=&a
是一个初始化,而不仅仅是一个“声明和赋值”;例如,具有静态持续时间的对象只能用常量初始化。
int *p=&a; // declaration and assignment