无论我如何尝试,我的指针/地址都是错误的

时间:2019-01-01 22:57:36

标签: c pointers memory-address

这是我正在尝试的:

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匹配相同的地址吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

现在abptr是3个不同的变量(无论它们的类型如何)

所以他们的地址是不同的。通过使用 not 而不使用指针变量的 address ,您将具有相同的值。

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("b is %p\n",b);

答案 1 :(得分:3)

  

我希望&b显示与&a相同的地址……

具有这种期望的意思是,您对C语言中的指针如何工作以及它们的语义有错误的思维模型。关键的误解似乎发生在原始代码片段的以下两行:

首先有

b = *ptr;

此行转换为*“将地址ptr处的内存内容复制到变量b中。”变量b甚至从未与指针本身接触。您可以将其完全重写为相同的效果

int tmp = *ptr;
b = tmp;

事实上,那里的每个现代C编译器都会为这两种情况生成相同的代码。

您有误解的第二行是这个

printf("&b is %p\n",&b);

具体来说,获取变量b的地址的结果,即&b的结果。 b是一个完全独立的变量,具有自己的地址。 该地址不能更改!唯一可以更改的变量是变量的值。

指针也是变量,是的,指针本身确实具有地址。指针的值是它指向的地址。但是,像每个变量一样,您无法更改变量存储的地址,并且当您将地址分配给指针时,您正在更改其值。因此,在第二个代码片段中,当您分配b = ptr;时,您会将ptr value 复制到b。之后,ptrb都指向相同的地址,但是这两个指针是具有相同值的两个独立副本,其中每个副本都位于内存中的不同位置。自然地取b的地址会产生与ptr的地址不同的东西。