【问题标题】:how a pointer to pointer is able to refer the array指向指针的指针如何能够引用数组
【发布时间】:2013-07-15 17:34:11
【问题描述】:
#include<cstdio>
int main() {

int a[5] = {1,2,3,4,5};

int *ptr = (int*)(&a+1);

printf("%d %d" ,*(a+1),*(ptr-1));
}

这里a+1的地址位置被类型转换为点ptr;

我试过 ptr = (int)&a 它指向数组.. 由于指针地址存储在某个位置,因此指针 ptr 指向该位置 如何使用 *ptr 引用数组元素的位置

程序的输出是 2 5 你能解释一下 5 是怎么输出的吗

【问题讨论】:

  • 你在哪里没有指向指针的指针。
  • 至于为什么&amp;a返回指向指针的指针,参见例如this old question
  • @JoachimPileborg 谢谢你的链接..

标签: c++ syntax


【解决方案1】:

由于a 是一个由 5 个整数组成的数组,&amp;a 是一个指向一个由 5 个整数组成的数组的指针。因为指针算术运算是在指向类型大小的倍数上进行的,所以&amp;a+1 是一个指向一个虚构数组的指针,该数组紧跟在a 中存储的整数之后。当您将其转换为指向 int 的指针并存储在 ptr 中时,您将获得指向该数组中第一个 int 的指针。

换句话说,

int *ptr = (int*)(&a+1);

等价于

int *ptr = (a + 5);

这使得*(ptr-1)*(a+4) 相同,与a[4] 相同,a 的最后一个元素。

【讨论】:

    【解决方案2】:

    数组的名字就是地址。所以&amp;aa 具有相同的值。 &amp;a 计算为相同的地址,它创建了一个 int(*)[size] 类型的指针,它是一个指向数组的指针,而不是指向单个元素的指针。如果你增加这个指针,它会增加整个数组的大小,而不是单个元素的大小。

    【讨论】:

      【解决方案3】:

      int * ptr = &a[0]; ptr 现在指向数组的第一个元素 (1) ptr + 1 指向 2,等等。

      【讨论】:

      • (&a+1)和&a[1]有区别;
      • -1,没抓住重点。 ptr+1 指向ptr 之后的一个,但这是一个元素。而这里的元素是int[5]
      • 你是对的。我回答的真正意义应该是“不要那样做”。我试图展示一种将指针附加到数组的更好方法。实际上 int * ptr = a;和 int * ptr=&a[0];产生相同的结果,但我看到很多开发人员对第一个(包括这个问题的海报)感到困惑。
      • OP 代码中的转换不正确。他正在将指向对象的类型从 int[5] 更改为 int。将 1 加到 int[5]* 指向数组之外的地址。 int * 加一指向数组的下一个元素。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 2019-03-11
      • 1970-01-01
      • 2016-07-30
      相关资源
      最近更新 更多