int * p =&a和q =&a之间有什么区别?

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

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

 int a = 10; int *q; q = &a; 

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

这两个是相同的:

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

在另一个中,您将两个步骤合并为一个:

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

如果你有一些编译器优化ON,编译器可能会结合这两个步骤。

你的两段代码是等价的 – 没有区别。

通常对于任何类型T ,任何变量名称x和任何表达式expT x = exp;T x; x = exp; T x; x = exp; 相当于彼此。

第一个是初始化 ,第二个是赋值 。 从技术上讲,它们都是非常不同的操作,碰巧使用相同的操作符,具有非常不同的含义 – 在C中=符号,如果你愿意,“过载”。

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


该标准单独定义它们。 在这种情况下,没有差异,但有时有。 例如,当对象具有静态存储时,您只能初始化为文字和常量表达式,而您可以轻松地为其分配其他内容。 存在更多差异,这一切都归结为它们是由于某种原因使用相同符号的不同操作

两种方式都没有区别。 两者都做同样的事情。
首先,您在声明时初始化。 在下一个中,您推迟初始化。 两者都在做同样的事情,即存储变量’a’的地址。
关于它如何在内存中工作。 ‘a’分配了内存(2/4字节)并将其值存储在此位置。 使用&a(即a的地址)将第一个字节的地址存储在’p’/’q’中,其本身具有分配的存储器。
要使用指针检索值,可以使用* p / * q(即存储在p中的地址处的值)