簡體   English   中英

C 語言。 看不懂指針的output

[英]C language. Can't understand the output of the pointers

我有以下代碼。

    int a = 10, b = 20;
    int *x, *y, *z;
    int **pp;
    int arr[3] = { 5, 13, 29 };
    x = &b;
    pp = &y;
    y = arr + 1;
    *y = a;
    z = y;
    **pp = 999;
    y++;

    printf("%i %i %i %i %i %i %i %i %i", a, b, *x, *y, *z, **pp, arr[0], arr[1], arr[2]);

我預計 output 將是10 20 20 29 10 999 5 999 29 ,但是,正確的 output 似乎是10 20 20 29 999 29 5 999 29 區別在於*z**pp 我無法理解為什么會這樣,盡管我嘗試繪制圖表並逐步分析結果。 為什么*z**pp分別是 999 和 29,而不是 10 和 999? 謝謝你。

在這個聲明之后

y = arr + 1;

指針y指向數組arr的第二個元素,

所以在下一條語句后第二個元素設置為10

*y = a;

我們有數組arr的以下內容

{ 5, 10, 29 }

指針 z 也指向第二個元素

 z = y;

但是第二個元素被重寫了

 **pp = 999;

因為取消引用的指針pp總是產生指針y 現在數組的內容是

{ 5, 999, 29 }

並且指針y遞增並且在此語句之后

y++;

指向數組的第三個元素。 請注意,指針pp仍指向指針y ,該指針現在存儲數組第三個元素的地址。

變量ab沒有改變 > 所以調用printf輸出

10 20

指針x指向變量b所以我們有

10 20 20

指針y指向數組的第三個元素。 所以

10 20 20 29

指針z指向數組的第二個元素,因為它在遞增之前具有指針y的值。

10 20 20 29 999

指針pp指向指針y ,因此表達式**pp產生與表達式*y相同的值

10 20 20 29 999 29

而這些表達式arr[0], arr[1], arr[2]依次提供數組的值

10 20 20 29 999 29 5 999 29

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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