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

Nat*_*Lee 1 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;
}
Run Code Online (Sandbox Code Playgroud)

Aja*_*iya 5

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

引用C11,章节§6.2.4p2

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

引用C11,章节§note33

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

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

因此,在不同时间构造到这些指针的任何两个指针(在第一个中使用&类似)也将比较相等.即使它们的值在执行过程中发生变化,也是如此.&n1&n2printf