保存数组地址的指针的地址如何相同?
Posted
技术标签:
【中文标题】保存数组地址的指针的地址如何相同?【英文标题】:How the address of pointer that holds the address of array are same? 【发布时间】:2015-07-28 11:50:58 【问题描述】:这里的p
是一个整数指针,它可以保存int
变量的地址,但它也有一个内存地址——存储它的地方。
让
数组基址a = 1002
指针地址p = 2008
当我们写信时:int *p=a; //p points to the base address of array a
和int **r=&p; //means *r points to the address of p
*r
如何指向a
的地址,应该指向p
的地址。
#include <stdio.h>
void main()
int a[3] = 1, 2, 3;
int *p =a;
int **r = &p;
printf("%p %p", *r, a);
【问题讨论】:
为什么不一样?你让r
指向存储p
的地址,然后打印*r
,那么显然是p
,你分配给a
应该是 int *p = &a;否则是无效的转化
@DevangJayachandran: int [3]
衰减为 int*
哦,对了,对不起!我的错。
【参考方案1】:
您的printf
不正确。打印r
指向的地址应该是r
:
printf("%p %p", r, a);
通过使用*r
,您遵循r
(即跳转到r
指向的地址),从而打印a
的地址。
【讨论】:
【参考方案2】:请注意
int *p=a;
表示a
和p
现在指向同一个地址。
另外,r
指向p
(是p
的地址)而不是*r
。
因此要打印p
的地址,只需在printf()
中使用r
而不是*r
。
printf("%p %p", r, a);
【讨论】:
【参考方案3】:下面是什么?
int **r = &p;
基本上使用上面,r
持有p
的地址,对吗?
所以如果你取消引用r
,就像你做*r
,它会尝试
检索存储在p
地址的值,对吗?这是a
。
注意:您需要在 printf 中转换为void*
:
printf("%p %p", (void*)*r, (void*) a);
【讨论】:
【参考方案4】:不 ->-> 和 -> 一样
当你说,
int *p = a;
表示P指向a,或者P持有a的地址。
int **r=&p;
的情况相同
R 持有 P 的地址,
如果你使用printf("%p %p", r, a);
,你就会得到P的地址。
但由于您要取消引用 r,因此您得到了 a 的地址。
【讨论】:
以上是关于保存数组地址的指针的地址如何相同?的主要内容,如果未能解决你的问题,请参考以下文章