我正在學習一些 C 語言并且我正在測驗簡單的指標事物,以便我可以更多地理解它們。我覺得我沒有做對。給定下面的簡單代碼:
#include <stdio.h>
void main() {
long n = 1;
long *y = &n;
n = 2;
printf("n: %d\n",&n);
printf("y: %d\n",y);
}
結果是:
n: 6422296
y: 6422296
我猜這是記憶中的位置。
如果我將列印行更改為:
printf("n: %d\n",&n);
printf("y: %d\n",&y);
結果是:
n: 6422300
y: 6422296
我想在記憶體n
中存盤了 4 個位元組y
,但不明白為什么。我沒有改變n
輸出,我離開了&
但是當添加&
到y
.
如果我這樣離開它:
printf("n: %d\n",n);
printf("y: %d\n",&y);
輸出是:
n: 2
y: 6422296
這個結果是我所期待的。
為什么會有這種行為?我缺少一些東西。
不要粗魯。我閱讀了關于指標的教程和解釋,但沒有任何東西可以為我解釋這些。
uj5u.com熱心網友回復:
y
為您提供值,即n
.
&y
給你的地址y
,不管是什么型別y
。
&
是地址運算子。它為您提供變數的地址。*
在運算式中使用時,是取消參考運算子。它為您提供指標指向的值。在你的例子*y
中會給你的價值n
。*
在宣告中使用時(例如 yourlong *y
)指定變數將保存地址/指標。
要學習和理解 C,閱讀著名的C FAQ的相應部分會有所幫助。
uj5u.com熱心網友回復:
我認為您的問題歸結為“為什么n
當我添加列印地址時地址會更改y
”。答案歸結為編譯器和優化器如何作業以及它們如何為事物分配存盤的細節。
當你宣告一個像這樣的函式的區域變數時,編譯器有很大的自由來處理它。它可以在它為函式創建的堆疊幀中分配空間,也可以將變數保存在暫存器中,或者兩者都做,甚至可以做其他事情。唯一的要求是它最終生成與程式的執行語意相匹配的代碼。
在像這樣的區域變數的情況下,如果它們的地址從未被占用(就像 的情況一樣y
),那么一個好的編譯器通常會嘗試將變數保存在暫存器中并且永遠不會為它分配記憶體。因此,在第一個程式中,它只需要n
堆疊幀中的一個變數 ( ) 的空間(n
已獲取其地址,因此必須駐留在記憶體中才能獲得地址)。
在第二個程式中,兩者y
和n
都有它們的地址,所以它們都必須在記憶體中。碰巧編譯器決定放置y
在較低地址和n
較大地址,但沒有保證。也沒有要求它們在任何意義上都彼此“相鄰”。
uj5u.com熱心網友回復:
n
是一個長的,y
是一個指標long
。兩者都占用了自己的記憶
我稍微修改了你的代碼:
#include <stdio.h>
void main() {
long n = 1;
long *y = &n;
n = 2;
printf("&n: %p\n",&n); //Please change format specifier to %p for pointer
printf("y: %p\n",y);
}
在第一次printf()
呼叫中,您正在列印 的地址n
,在第二次printf()
呼叫中,您正在列印存盤在 中的值y
。y
由于您使用 的地址進行了初始化,因此n
這些必須相同。
在您的下一組printf()
s 中(再次稍作修改):
printf("n: %ld\n",n); //Please change format specifier to %ld for long int
printf("&y: %p\n",&y); //This one is still a pointer though (long**)
您正在列印 的值n
和地址y
。
第一個printf()
必須列印2
,因為它是存盤在n
. 第二個printf()
是要列印的地址y
,也就是存盤地址的記憶體地址n
。&y
是一個指向 long 的指標。
printf("&y: %p\n",&y);
永遠不能列印的地址,n
因為y
和n
存盤在不同的記憶體位置
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/470456.html
下一篇:在C 中下標/索引指標