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 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

我以为答案是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
前面的
sizeof(int)
字节,即指向
&a[4]
,而
*(ptr-1)
a[4]

指针运算是以“指针对象的大小”为单位完成的。由于
&a
是一个指向5个
int
-an
int(*)[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 ?