[英]Output of a code- behaviour of & in c
我遇到了一個我無法理解的代碼輸出。代碼是 -
int main()
{
int a[] = {1, 2, 3, 4, 5, 6};
int *ptr = (int*)(&a+1);
printf("%d ", *(ptr-1) );
return 0;
}
上面代碼的輸出結果是6,但我認為它應該是1.請解釋為什么它是6。
在你的問題中,“&a”是整個數組a []的地址。 如果我們將&1加1,我們得到“[] + sizeof(a)的基地址”。 並且這個值被類型化為int *。 所以ptr指向6后的內存。 ptr被類型化為“int *”並且打印了*(ptr-1)的值。 由於ptr指向6后的內存,所以ptr - 1指向6。
&a
是數組a
的地址。 向它添加1
會將其增加到數組之后的一個(添加24個字節)。 Cast運算符(int*)
cast &a+1
指向int
類型的指針。 ptr-1
將ptr
遞減4
個字節,因此它是數組a
的最后一個元素的地址。 取消引用ptr - 1
將給出最后一個6
元素。
是的,因為a
是一個類型為int[6]
的數組。 因此, &a
為您提供int (*)[6]
。 它與指向int的指針不同,它是指向int
數組的指針。
因此, &a + 1
將指針增加一個數組大小 ,指向數組的最后一個元素。
然后,獲取ptr
的地址並執行-1
,將地址減小sizeof(*ptr)
,即sizeof(int)
,它將為您提供數組中最后一個元素的地址。
最后,取消引用該地址,您將獲得最后一個元素的值, 6
。 成功。
因為(int*)(&a + 1)
使用整個數組作為基類型,並將1個整數的數組添加到地址,即添加24個字節。
當你執行ptr-1
因為ptr
類型是int,它將只減去4個字節。 在進行指針運算時記住指針的類型非常重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.