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

时间:2014-03-31 16:31:12

标签: c pointers

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

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

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

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

4 个答案:

答案 0 :(得分:5)

这两个是相同的:

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

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

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

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

答案 1 :(得分:3)

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

通常,对于任何类型T,任何变量名称x和任何表达式expT x = exp;T x; x = exp;都是相同的。

答案 2 :(得分:3)

第一个是初始化,而第二个是分配。从技术上讲,它们都是非常不同的操作,碰巧使用相同的操作符,具有非常不同的含义 - 在C中=符号是,如果你愿意,"重载"。

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


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

答案 3 :(得分:0)

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