簡體   English   中英

C指針-從絕對地址中讀取值與AddressOf運算符(&)

[英]C pointers - Reading values from absolute addresses vs AddressOf operator (&)

如果我不編譯代碼,我會說12給出相同的結果,因為它們兩個都有一個指向變量ageint指針p 12中取消引用年齡應該得到相同的結果。 我也明白3只會給我可變年齡的第一個字節,因為它是char類型。 我無法解釋為什么12給出不同的結果,以及為什么23給出相同的結果。

1

int age = 20;
int* p = (int *)0x66FC9C;
printf("You're : %d\n", *p );

2

int age = 20;
int *p = &age;
printf("You're : %d\n", *p );

3

int age = 20;
char* p = (char *)0x66FC9C;
printf("You're %d\n", *p );

跟進

這很奇怪,因為當我這樣做時:

int age1 = 20;
int age2 = 19;
int* p = &age2;
printf("You're %d  %d  %d  %d\n", *p, *(p+1), &age1, &age2 );

在此處輸入圖片說明

並且我實際上打印出的地址我總是總是正確地獲得p + 1 (這意味着我可以預測地址),但是如果我這樣做了:

int age1 = 20;
int age2 = 19;
int* p = &age2;
printf("You're %d  %d\n", *p, *(p+1)  );

在此處輸入圖片說明

我永遠猜不到。 就像C知道有人在監視... 咳嗽咳嗽雙縫實驗

您正在嘗試欺騙編譯器,它看起來比您更聰明...

更嚴重的是,除非您真的了解編譯器的內部知識,否則請不要嘗試猜測它將如何轉換源代碼。 通常,在您的最后一個示例中,編譯器可以輕松地看到age1變量從未使用過(至少從來沒有以一致的方式使用過)。 因此可以對其進行優化。 如果您確實想更好地了解此處發生的情況,則必須要求編譯器產生其內部生成的匯編語言,然后進行閱讀。 您將看到一個變量是否已被優化(因為未生成),或者它是否與其他變量不連續。

不管怎么說,這是不錯的嘗試,以便更好地了解編譯器做什么,但是請永遠不會做在生產代碼。

您知道誰的age是0x66FC9C? 如果不是,那么您將無法保證在1和2中得到相同的結果。可以對2和3進行等效推理。

暫無
暫無

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

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