学习者问题。我可以用两种不同的方式声明和初始化指针
int a = 10;
int *p = &a;
也
int a = 10;
int *q;
q = &a;
我想知道两者之间的区别是什么?它在内存中是如何工作的?
答案 0 :(得分:5)
这两个是相同的:
int *p; // declaration
p = &a; // assignment
在另一个中,您将两个步骤合并为一个:
int *p=&a; // declaration and assignment
如果你有一些编译器优化ON,编译器可能会结合这两个步骤。
答案 1 :(得分:3)
你的两段代码是等价的 - 没有区别。
通常,对于任何类型T
,任何变量名称x
和任何表达式exp
,T x = exp;
和T x; x = exp;
都是相同的。
答案 2 :(得分:3)
第一个是初始化,而第二个是分配。从技术上讲,它们都是非常不同的操作,碰巧使用相同的操作符,具有非常不同的含义 - 在C中=
符号是,如果你愿意,"重载"。
在这种情况下,它会转化为相同的行为。
标准单独定义它们。在这种情况下,没有差异,但有时有。例如,当对象具有静态存储时,您可以初始化它仅限于文字和常量表达式,而您可以轻松地分配其他内容。存在更多差异,这一切都归结为它们不同的操作,由于某种原因使用相同的符号。
答案 3 :(得分:0)
两种方式都没有区别。两者都做同样的事情。
首先,您在声明时初始化。在下一个中,您推迟初始化。
两者都在做同样的事情,即存储变量的地址' a'
关于它如何在内存中工作。 '一个'分配内存(2/4字节)并将其值存储在此位置。第一个字节的地址存储在' p' /' q'使用& a(即a的地址)本身具有分配的内存。
要使用指针检索值,可以使用* p / * q(即存储在p中的地址的值)