[英]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
,該指針現在存儲數組第三個元素的地址。
變量a
和b
沒有改變 > 所以調用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.