保存数组地址的指针的地址如何相同?

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 aint **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;

表示ap 现在指向同一个地址。

另外,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=&amp;p; 的情况相同

R 持有 P 的地址, 如果你使用printf("%p %p", r, a);,你就会得到P的地址。

但由于您要取消引用 r,因此您得到了 a 的地址。

【讨论】:

以上是关于保存数组地址的指针的地址如何相同?的主要内容,如果未能解决你的问题,请参考以下文章

c 复习

c 复习

c 复习

C多维数组中的指针地址

基于arm的C++反汇编 数组和指针的寻址

如何保存一个指针地址,以便另一个指针可以继续工作?