【问题标题】: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*
  • 哦,对了,对不起!我的错。

标签: c++ c arrays pointers


【解决方案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 的地址。

        【讨论】:

          猜你喜欢
          • 2019-04-07
          • 1970-01-01
          • 2016-02-08
          • 2013-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-06
          相关资源
          最近更新 更多