簡體   English   中英

&的輸出代碼行為

[英]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-1ptr遞減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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM