2011-06-30 83 views
1

我有很多次碰到聲明char* ch = "hello";聲明的含義

據我所知,char* ch告訴ch是朝着char的指針。但是,如何將hello分配給ch意味着什麼?

我難以忍受嗎?請幫忙。

回答

4

這意味着ch是一個指向字符的指針。當您這樣做時char* ch = "hello"ch將指向第一個字符,即字符h。要指向第二個字符,您可以執行ch + 1ch[1]。請注意,理想情況下,ch的類型應爲const char*,因爲您無法寫入指向的內存位置。

+1

請注意,此常量去除特殊轉換在C++ 98/C++ 03中已棄用,並且在C++ 0x中被刪除(即,使用符合的C++ 0x編譯器將不會編譯)。 –

+0

downvote的具體原因是什麼?答案有問題嗎? – Naveen

+0

+1以反擊匿名downvote。 –

3

字符串文字被靜態存儲在程序二進制文件的某處。它們很可能被加載到內存中只讀的「數據」部分,但這是未定義的行爲。

分配字符串文字只是傳遞第一個字節的地址;在這種情況下,char* ch指向「hello」中的'h'。

注意:修改靜態字符串是未定義的行爲!雖然你可以得到一個指針,但任何賦值都是危險的。

+0

...所以,它應該是const char * ch – cdarke

0

聲明編譯爲:

080483b4 <main>: 
80483b4: 55      push %ebp 
80483b5: 89 e5     mov %esp,%ebp 
80483b7: 83 ec 10    sub $0x10,%esp 
80483ba: c7 45 fc 94 84 04 08 movl $0x8048494,-0x4(%ebp) 
80483c1: c9      leave 
80483c2: c3      ret 

字符串在0x8048494是 「你好\ 0」 作爲在這裏看到來自XXD:

0000490: 0100 0200 6865 6c6c 6f00 0000 011b 033b ....hello......; 
1

有幾件事情發生在這裏。

"hello"等於{ 'h', 'e', 'l', 'l', 'o', '\0' }。即,它是一組字符。數組可以隱式轉換爲相應的指針類型。因此,這裏的語句確實創建了一個(靜態)字符數組,並將指向第一個元素的指針指向變量ch(順便說一句,這是錯誤的命名)。