我创建了一个变量,然后打印了它的位置号。然后,我将内存位置增加了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
答案 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
的值。同样适用于您的情况。
简而言之,x
和i
是两个不同的变量,它们具有自己的值。现在,假设x
是一个指针并分配了i
地址的值,您可以使用x
来获取存储在i
的值。就是这样。
这不会以某种方式将两个变量“链接”在一起,但仍然可以彼此独立地对其进行修改。唯一的事情是,在修改x
的值之后,您将无法再使用它来访问存储在i
中的值,因为它不再指向i
的地址。>