创建一个变量,然后将其内存地址增加1

时间:2019-04-03 12:24:09

标签: c pointers

我创建了一个变量,然后打印了它的位置号。然后,我将内存位置增加了1。在两种情况下,我得到了预期的结果,而一种情况下给出的答案是我的老师无法正确解释的。如果有人告诉我为什么第二个printf("%p\n",&i)给出的输出与第一次相同,那将非常有帮助。

int main()
{
    int i=3,*x;
    x=&i;
    printf("%p\n",x);
    printf("%p\n",&i);
    printf("%p\n",&(*x));
    x++;
    printf("\n");
    printf("%p\n",x);
    printf("%p\n",&i);
    printf("%p\n",&(*x));
}



0x7ffce5dc5208
0x7ffce5dc5208
0x7ffce5dc5208

0x7ffce5dc520c
0x7ffce5dc5208
0x7ffce5dc520c

5 个答案:

答案 0 :(得分:5)

C程序中的每个对象在其存在期间均具有唯一的固定地址。您将i的地址副本存储到x中。然后,您操纵x更改其持有的值,现在它包含另一个地址。但是对x中的值的操作不会移动i。名为i的对象仍在同一位置。

答案 1 :(得分:2)

变量的地址在其生命周期内从未改变。仅仅因为x开始包含该地址的值,然后又增加x的值并不意味着i的地址发生了变化。

从评论中进行类比,假设您将房子的地址写在一张纸上。现在,假设您增加那张纸上的门牌号的值。您的房屋不在其他地方,您只是更改了写下的门牌号码。

因此&i将始终具有相同的值,而不管x可能包含什么值。

答案 2 :(得分:1)

因为指针值增加了,但是变量i的地址保持不变。指针变量也是保存变量i地址的变量,更改其值不会影响i变量的地址。

答案 3 :(得分:1)

代码段x = &i 复制 i的地址到x指针中。这是一个副本,因此对其进行修改只会修改存储在x中的值,而永远不会更改i的地址。

我不确定您要达到的目标。您不能更改变量的地址。

答案 4 :(得分:0)

特别是,这与指针和内存地址无关。检查以下程序

int x = 5;
int y = x;

printf (" x= %d, y = %d\n", x, y);
y++;
printf (" x= %d, y = %d\n", x, y);

输出:

  

x = 5,y = 5

     

x = 5,y = 6

更改y不会影响x的值。同样适用于您的情况。

简而言之,xi是两个不同的变量,它们具有自己的值。现在,假设x是一个指针并分配了i地址的值,您可以使用x来获取存储在i的值。就是这样。

这不会以某种方式将两个变量“链接”在一起,但仍然可以彼此独立地对其进行修改。唯一的事情是,在修改x的值之后,您将无法再使用它来访问存储在i中的值,因为它不再指向i的地址。