int main()
{
int *p;
printf("%p \n", &p);
printf("%p \n", p);
return 0;
}
通過執行此代碼,我收到以下輸出:
0x16b77f710
0x104683f4c
我希望得到相同的記憶體地址,因為&pid 沒有參考任何其他變數。
為什么我得到兩個不同的記憶體地址?
謝謝,
uj5u.com熱心網友回復:
指標是一個普通物件(在您的情況下為int *)。它不能指向自己,因為這種指標的型別必須是int **

*圖片盜自網路。
uj5u.com熱心網友回復:
指標是一個變數,就像任何其他變數一樣。它有一個地址,通常是該變數所在的記憶體地址。
與任何其他變數一樣,指標變數也包含一些資料。對于指標變數,該資料是某個其他變數的地址,即指標指向的變數。
變數的地址和變數的內容是完全不同的兩件事。他們幾乎從來都不是平等的。
試試這個程式,我給你的變數p一些指向:
int main()
{
int i = 5;
int *p = &i;
printf("p: %p, p's address: %p\n", p, &p);
printf("i: %d, i's address: %p\n", i, &i);
}
你應該注意兩件事:
- 與您的第一個程式一樣,“p”和“p 的地址”將不同。
- 無論您看到“p”的值是什么,它都與“我的地址”相同。
uj5u.com熱心網友回復:
原因是指標在宣告時默認不指向自身。簡化后,您可以將其想象為一個指標占用 2 個記憶體單元。1 個記憶體單元具有指標本身所在的虛擬地址(在您的情況下為 &p),第二個記憶體單元包含指標指向的虛擬地址(在您的情況下為 p)。
由于記憶體單元在被釋放時仍保留其值,因此包含指標目標地址的單元仍包含來自另一個已完成行程的過時值。
如果你宣告一個新的整數變數,然后用 printf 列印它的值,你也會有同樣的現象,你會看到新變數中已經有一些數字會出現完全隨機。這也是由于在相應的存盤單元中仍然存在過時的值。
uj5u.com熱心網友回復:
假設有一個隨機記憶體塊只是為了理解它的名字a。現在假設它p指向那個記憶體塊。
&p回傳存在的記憶體塊的地址p。
p將記憶體塊(&a)的地址回傳給指向的變數/記憶體塊(a)p。
所以當然它會給出不同的記憶體地址。
uj5u.com熱心網友回復:
我希望得到相同的記憶體地址,因為 &p id 沒有參考任何其他變數。
指標變數不會自動指向自身;如果您沒有明確初始化它們,那么它們的初始值將是不確定的(或者NULL,取決于它們的宣告方式)。
指標變數并沒有什么神奇之處——就像任何其他標量一樣,它們存盤某種值;只是在他們的情況下,該值是另一個物件的地址。
如果您真的想p存盤自己的地址,則必須執行以下操作
p = (int *) &p;
強制轉換是必需的,因為運算式 的型別&p是int **,并且您不能將一種型別的指標值分配給不同指標型別的變數。但是,不能保證指向不同型別的指標具有相同的大小、表示形式或對齊方式。在像 x86 這樣的現代商品硬體上int *,您可能可以指望并int **具有相同的大小和表示形式,但請注意,并非所有地方都必須如此。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/364737.html
