新声明后内存地址是否会改变?

时间:2017-11-09 04:21:44

标签: c pointers declaration

执行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;
}

2 个答案:

答案 0 :(得分:5)

让我们看看标准对此有何看法 -

引用C11,章§6.2.4p2

  

对象的生命周期是程序执行的一部分,在此期间保证为其保留存储。存在一个对象,具有一个常量地址[33]并在其整个生命周期内保留其最后存储的值。 [...]

引用C11,章§note33

  

术语&#34;常数地址&#34;意味着在可能不同的时间构造的对象的两个指针将比较相等。在同一程序的两次不同执行期间,地址可能不同。

现在,我们拥有的对象是n1n2pn。所有这三个都具有自动存储持续时间。

因此,在不同时间内构造的这两个指针(在& &n1中使用&n2printf)也会比较相等。即使它们的值在执行过程中发生变化,也是如此。

答案 1 :(得分:1)

不,内存地址不会改变。因为为任何变量赋值新值不会以任何方式改变变量的内存地址。如果是这种情况,那么将变量的地址存储在指针变量中将是没有意义的,这不是那样的。