[英]C pointers - Reading values from absolute addresses vs AddressOf operator (&)
如果我不編譯代碼,我會說1和2給出相同的結果,因為它們兩個都有一個指向變量age的int指針p 。 在1和2中取消引用年齡應該得到相同的結果。 我也明白3只會給我可變年齡的第一個字節,因為它是char類型。 我無法解釋為什么1和2給出不同的結果,以及為什么2和3給出相同的結果。
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.