执行n1之后的“第0句”存储器地址,n2和* pn为ADDR:0061FF2C,0061FF28,0061FF24。执行1),2)和3)后他们会改变吗?我为每个代码都添加了printf,但它们似乎没有改变。从理论上讲,它们不应该因为变量被分配了新值而改变吗?
#include <stdio.h>
int main(void)
{
int n1=3, * pn = &n1;
int n2=0;
printf("%p, %p, %p\n", &n1, &n2, &pn); // 0)
n2 = *pn; // 1)
*pn = n2 + 1; // 2)
n1 = *pn + *(&n2); // 3)
printf("%d, %d, %d\n",n1,n2,*pn); // 4)
return 0;
}
答案 0 :(得分:5)
让我们看看标准对此有何看法 -
引用C11
,章§6.2.4p2
对象的生命周期是程序执行的一部分,在此期间保证为其保留存储。存在一个对象,具有一个常量地址
[33]
并在其整个生命周期内保留其最后存储的值。[...]
和
引用C11
,章§note33
术语&#34;常数地址&#34;意味着在可能不同的时间构造的对象的两个指针将比较相等。在同一程序的两次不同执行期间,地址可能不同。
现在,我们拥有的对象是n1
,n2
和pn
。所有这三个都具有自动存储持续时间。
因此,在不同时间内构造的这两个指针(在&
&n1
中使用&n2
,printf
)也会比较相等。即使它们的值在执行过程中发生变化,也是如此。
答案 1 :(得分:1)
不,内存地址不会改变。因为为任何变量赋值新值不会以任何方式改变变量的内存地址。如果是这种情况,那么将变量的地址存储在指针变量中将是没有意义的,这不是那样的。