這個問題可能看起來很重復;然而,我確實在這個網站上進行了認真的調查,仍然不能完全理解。
char str[] = "test";
printf("%p\n", str);
printf("%p\n", &str);
我知道str它本身是一個指向存盤“t”的起始位置的指標。因此,我希望printf("%p\n", str);顯示此地址(例如000000FFE94FFC34)。接下來,我想知道在我的作業系統中,存盤確切資訊的記憶體位置000000FFE94FFC34。(即str自身的地址。)
但是,第三行的輸出與前一行相同。這似乎是一種很奇怪的行為。我怎樣才能找出自己的地址str?我想這可以通過使用另一個指向我想要的指標的新指標來實作,即,char **super_pointer = str;但我認為這是一種不必要的復雜方式。
uj5u.com熱心網友回復:
讓我們用添加的指標畫出它,希望能讓它更容易理解:
-------- -------- -------- -------- -------- | str[0] | str[1] | str[2] | str[3] | str[4] | -------- -------- -------- -------- -------- ^ | &str[0] | &str
正如您所看到的,指向第一個元素的指標(&str[0]即普通str衰減到的元素)指向與陣列本身相同的位置 ( &str)。
但是(這是一個重要的但是):型別非常不同!
的型別&str[0]是char *。
的型別&str是char (*)[5]。
在另一個音符上你說
...
str本身就是一個指標...
這是錯誤的。str本身就是陣列,它可以衰減為指向其第一個元素的指標。
uj5u.com熱心網友回復:
我知道 str 本身是一個指向存盤“t”的起始位置的指標。
正如你寫的“str本身”不是指標,它是一個陣列。但是在運算式中使用的陣列指示符很少有例外被轉換為指向它們的第一個元素的指標。
來自 C 標準(6.3.2.1 左值、陣列和函式指示符)
3 除非它是 sizeof 運算子或一元 & 運算子的運算元,或者是用于初始化陣列的字串文字,否則型別為“array of type”的運算式將轉換為型別為“pointer”的運算式鍵入 '' 指向陣列物件的初始元素并且不是左值。如果陣列物件具有暫存器存盤類,則行為未定義。
在這次通話中
printf("%p\n", str);
str用作引數運算式的陣列指示符被轉換為指向其第一個元素的指標。實際上這個呼叫相當于
printf("%p\n", &str[0]);
即這個呼叫輸出陣列占用記憶體范圍的起始地址。
這個電話
printf("%p\n", &str);
最好寫成和之前的呼叫一樣
printf("%p\n", ( void * )&str);
還輸出陣列所占用記憶體范圍的起始地址。
有什么不同?
表達str 在呼叫中使用printf的型別為char *同時表達&str 具有型別char ( * )[5]。
這兩個運算式被呼叫解釋為型別的運算式void *。
為了更清楚地說明這一點,請考慮一個二維陣列
char str[2][6] = { "test1", "test2" };
整個陣列的地址及其第一個“行”的地址和第一個“行”的第一個字符的地址是一致的。
即表達&sgtr具有型別char ( * )[2][6]和表達&str[0]具有型別char ( * )[6]和表達&str[0][0]具有型別char *產量相同的值:HHE開始的存盤器范圍的地址由所述陣列的占有..
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314986.html
上一篇:訪問超出最初宣告的指標的記憶體
