我讀到,當您使用指針聲明字符串時,指針包含字符串文字的內存地址。所以我期望從這段代碼中獲得內存地址,但是我得到了一些隨機數。請幫我理解爲什麼它不起作用。使用字符指針聲明的字符串的內存地址
int main()
{
char *hi = "Greeting!";
printf("%p",hi);
return(0);
}
如果指針hi
包含文字字符串的內存地址,那麼它爲什麼不顯示的內存地址?
我讀到,當您使用指針聲明字符串時,指針包含字符串文字的內存地址。所以我期望從這段代碼中獲得內存地址,但是我得到了一些隨機數。請幫我理解爲什麼它不起作用。使用字符指針聲明的字符串的內存地址
int main()
{
char *hi = "Greeting!";
printf("%p",hi);
return(0);
}
如果指針hi
包含文字字符串的內存地址,那麼它爲什麼不顯示的內存地址?
它確實有效。只是您可以將地址視爲由C運行時任意選擇的地址。 hi
是一個指針,設置爲字符串中首字母爲G
的地址。您擁有從hi
開始的所有內存,直到包括該字符串末尾的空終止符。
此外,使用const char *hi = "Greeting!";
而不是char *
:開始hi
內存只讀。不要嘗試修改字符串:嘗試這樣做的行爲是undefined。
你得到的「隨機數」是內存地址。它們不是恆定的,因爲在每次執行程序時,都會使用其他內存地址。
指針可以用幾種方式表示。格式字符串"%p"
「寫入實現定義的字符序列,定義指針」。在大多數情況下,它將被指向的對象的地址解釋爲適當大小的無符號整數,它看起來像「一堆隨機數」。
用戶可讀的指針表示通常只用於調試。它允許你比較兩個不同的表示(指針是否相同?),以及在某些情況下,指針之間的相對順序和距離(指針是「第一」,它們有多遠)。將指針解釋爲整數可以很好地適用於此光學器件。
如果您能澄清您的預期輸出,對我們會有所幫助。也許你期望指針是基於零的?
請注意,雖然有些編譯器可能會接受您的示例,但使用const char *
會更明智。使用char *
將允許您嘗試修改您的字符串文字,這是未定義的行爲。
_but但我有一些隨機數_...你的輸出是什麼? – LPs
如果不是一堆隨機數,你希望內存地址看起來像什麼? – nwp
char指針指向字符串文字的地址。它不包含地址 –