2017-03-22 75 views
0

我讀到,當您使用指針聲明字符串時,指針包含字符串文字的內存地址。所以我期望從這段代碼中獲得內存地址,但是我得到了一些隨機數。請幫我理解爲什麼它不起作用。使用字符指針聲明的字符串的內存地址

int main() 
{ 
    char *hi = "Greeting!"; 
    printf("%p",hi); 
    return(0); 
} 

如果指針hi包含文字字符串的內存地址,那麼它爲什麼不顯示的內存地址?

+0

_but但我有一些隨機數_...你的輸出是什麼? – LPs

+2

如果不是一堆隨機數,你希望內存地址看起來像什麼? – nwp

+1

char指針指向字符串文字的地址。它不包含地址 –

回答

1

它確實有效。只是您可以將地址視爲由C運行時任意選擇的地址。 hi是一個指針,設置爲字符串中首字母爲G的地址。您擁有從hi開始的所有內存,直到包括該字符串末尾的空終止符。

此外,使用const char *hi = "Greeting!";而不是char *:開始hi內存只讀。不要嘗試修改字符串:嘗試這樣做的行爲是undefined

0

你得到的「隨機數」是內存地址。它們不是恆定的,因爲在每次執行程序時,都會使用其他內存地址。

0

指針可以用幾種方式表示。格式字符串"%p"「寫入實現定義的字符序列,定義指針」​​。在大多數情況下,它將被指向的對象的地址解釋爲適當大小的無符號整數,它看起來像「一堆隨機數」。

用戶可讀的指針表示通常只用於調試。它允許你比較兩個不同的表示(指針是否相同?),以及在某些情況下,指針之間的相對順序和距離(指針是「第一」,它們有多遠)。將指針解釋爲整數可以很好地適用於此光學器件。

如果您能澄清您的預期輸出,對我們會有所幫助。也許你期望指針是基於零的?

請注意,雖然有些編譯器可能會接受您的示例,但使用const char *會更明智。使用char *將允許您嘗試修改您的字符串文字,這是未定義的行爲。