指向指针的指针如何能够引用数组

Posted

技术标签:

【中文标题】指向指针的指针如何能够引用数组【英文标题】: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 谢谢你的链接.. 【参考方案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 * 加一指向数组的下一个元素。

以上是关于指向指针的指针如何能够引用数组的主要内容,如果未能解决你的问题,请参考以下文章

如何提升::序列化指针和引用?

取消引用指向整个数组的指针

关于C++基类、派生类的引用和指针

《C语言程序设计》指针

《C语言程序设计》指针

如何根据它们指向的值对双指针数组进行排序?