指向指针的指针如何能够引用数组
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 是怎么输出的吗
【问题讨论】:
你在哪里没有指向指针的指针。 至于为什么&a
不返回指向指针的指针,参见例如this old question。
@JoachimPileborg 谢谢你的链接..
【参考方案1】:
由于a
是一个由 5 个整数组成的数组,&a
是一个指向一个由 5 个整数组成的数组的指针。因为指针算术运算是在指向类型大小的倍数上进行的,所以&a+1
是一个指向一个虚构数组的指针,该数组紧跟在a
中存储的整数之后。当您将其转换为指向 int 的指针并存储在 ptr
中时,您将获得指向该数组中第一个 int 的指针。
换句话说,
int *ptr = (int*)(&a+1);
等价于
int *ptr = (a + 5);
这使得*(ptr-1)
与*(a+4)
相同,与a[4]
相同,a
的最后一个元素。
【讨论】:
【参考方案2】:数组的名字就是地址。所以&a
和a
具有相同的值。 &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 * 加一指向数组的下一个元素。以上是关于指向指针的指针如何能够引用数组的主要内容,如果未能解决你的问题,请参考以下文章