【发布时间】:2019-01-01 22:57:36
【问题描述】:
这是我正在尝试的:
int a,b;
int *ptr;
a = 123;
ptr = &a;
b = *ptr;
printf("&a is %p\n",&a);
printf("ptr points to %p\n",ptr);
printf("&ptr is %p\n",&ptr);
printf("&b is %p\n",&b);
结果:
&a is 0x7ffee01fc828
ptr points to 0x7ffee01fc828
&ptr is 0x7ffee01fc818
&b is 0x7ffee01fc820
我希望 &b 显示与 &a 相同的地址...但事实并非如此,所以我尝试了:
int a,*b;
int *ptr;
a = 123;
ptr = &a;
b = ptr;
printf("&a is %p\n",&a);
printf("ptr points to %p\n",ptr);
printf("&ptr is %p\n",&ptr);
printf("&b is %p\n",&b);
这仍然会导致 &b 出现意外的内存地址:
&a is 0x7ffee1cbd828
ptr points to 0x7ffee1cbd828
&ptr is 0x7ffee1cbd818
&b is 0x7ffee1cbd820
谁能帮我理解为什么我无法让 &b 与 &ptr 或 &a 匹配相同的地址?
谢谢!
【问题讨论】:
-
你在比较指针和指针...删除
&你会看到相同的值 -
因为在 C 中,没有两个不同的对象具有相同的地址。指针也是对象。它们和它们指向的东西不一样,就像一个信封和上面印有地址的房子不同。
-
请记住,指针只是一个普通变量,它保存其他东西的地址作为它的值。换句话说,一个指针指向可以找到其他东西的地址。您通常会想到一个保存立即值的变量,例如
int a = 5;,而指针只会保存5存储在内存中的地址,例如int *b = &a;。如果您需要存储在b指向的内存地址的值,您可以使用一元'*'运算符取消引用b,例如int c = *b;将初始化c = 5)。 -
@rici:与大多数其他编程语言不同,C 中的指针是实际内存地址,而不是对象。它们既不是信封,也不是房子。
-
@RobertHarvey -- 指针是对象,因为指针是内存中保存某些值的位置。 That is what C objects are.
标签: c pointers memory-address