C int*ptr=(int*)(&a+;1); #包括 内部主(空) { inta[5]={1,2,3,4,5}; int*ptr=(int*)(&a+1);//这里发生了什么? printf(“%d%d\n”,*(a+1),*(ptr-1)); 返回0; }
我以为答案是1,但我得到了5。。C int*ptr=(int*)(&a+;1); #包括 内部主(空) { inta[5]={1,2,3,4,5}; int*ptr=(int*)(&a+1);//这里发生了什么? printf(“%d%d\n”,*(a+1),*(ptr-1)); 返回0; },c,pointers,C,Pointers,我以为答案是1,但我得到了5。。 为什么?&a是指向int[5]的指针,因此&a+1也是指向int[5]的指针。松开&,一切都会好起来(而且你不再需要演员阵容): 获取数组的地址,然后向其中添加1,这将生成一个指针,指向a字节的大小,超过a的开头。然后将该指针转换为int*,并将其分配给ptr。同样的情况也可以通过以下方式实现: int *ptr = (int*)(&a + 1); // what happen here ? 在这种情况下 然后ptr-1是一个指针,指向ptr前面的s
为什么?
&a
是指向int[5]
的指针,因此&a+1
也是指向int[5]
的指针。松开&
,一切都会好起来(而且你不再需要演员阵容):
获取数组的地址,然后向其中添加1,这将生成一个指针,指向a
字节的大小,超过a
的开头。然后将该指针转换为int*
,并将其分配给ptr
。同样的情况也可以通过以下方式实现:
int *ptr = (int*)(&a + 1); // what happen here ?
在这种情况下
然后ptr-1
是一个指针,指向ptr
前面的sizeof(int)
字节,即指向&a[4]
,而*(ptr-1)
是a[4]
指针运算是以“指针对象的大小”为单位完成的。由于&a
是一个指向5个int
-anint(*)[5]
的数组的指针,向其中添加1将移动5*sizeof(int)
字节
int *ptr = &a[5];
a=数组第一个元素的地址:a[0](int地址)
&a=数组a的地址,值与“a”相同,但类型是数组的地址,所以表达式“(&a+1)”是指向下一个数组“a”的指针。
(ptr-1):指向ptr的前一个int的指针,表示数组“a”的最后一个元素的指针。数组名保存数组的基址。所以,*(a+1)给出了索引位置1处的元素,即2。表达式(&a+1)在数组结束后保存地址,并将其存储在指针变量“ptr”中。因此,*(ptr-1)给出了存储在最后一个索引位置的元素,即5。当然,输出由两个数字组成,而不是一个数字?您获取数组的地址,并假设它与第一个元素的地址相同。不是。类型不同,指针算法也不同。。我只是在说*(ptr-1)。。me的预期o/p-2 1实际o/p为-2 5。。不管怎样,丹尼尔·菲舍尔解释过了!谢谢还有另一个原因施放是绝对邪恶的。不,
&a
是一个int(*)[5]
,而不是int**
@IvayloStrandjev不是&a=>&a[0]?@arbit,相同的值不同的类型和不同的指针arithmetic@JensGustedt你的意思是如果我只使用a
,它将被转换为[0]但是如果我使用a+int
,那么它就是&a[5]+int
?好的。。然后int ptr=(int)(&a+2);然后ptr-6将产生相同的结果。。非常感谢:-)可能是,也可能不是。(&a+2)
是未定义的行为,因为指针算术仅在结果指针指向同一数组或超过末尾时定义<代码>(&a+2)将指向终点后的两点。但是在实践中,虽然行为是未定义的,但是实现按照您期望的那样运行的概率几乎是100%。。(&a+2)不指向终点后两点的可能性非常小。。所以最好是避免这种情况的发生。。谢谢你的建议,丹尼尔。
int *ptr = (int*)(&a + 1); // what happen here ?
int *ptr = &a[5];
int *ptr = (int*)(&a + 1); // what happen here ?