2016-04-01 74 views
-2

我所遇到的一個C++代碼:我堅持串和陣列

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; 
cout << "Greeting message: "; 
cout << greeting << endl; 

輸出:Hello

由於問候是大小爲6的陣列,顯示問候應該只顯示「H」,因爲greeting[0] in cout,因爲它顯示的是數組的第一個地址。我不知道我錯在哪裏。

+3

請說明爲什麼您期望它只顯示「H」。您正在打印'問候'而不是'問候[0]' – vu1p3n0x

+1

'問候'衰變成一個指針'char *'並且它所指向的整個字符串將被打印。如果您只想打印第一個字符,請使用'cout << greeting [0] << endl;'。 – Unimportant

+0

這是如何cout顯示字符串...因爲問候語是一個字符串,這就是爲什麼cout顯示「你好」,但如果你寫「問候[0]」,那麼cout將顯示'H'作爲字符... – Shiv

回答

2

greetingdecays to a pointer本身。但是,如果聽起來很複雜,你可以將它看作是一個指標,以瞭解cout做什麼。

cout方法打印字符從greeting[0]開始,直到\0

+0

我已經得到它的感謝! –

6

除了當它是sizeof或一元&運營商的操作數,表達型「NT - 元素陣列」的將被轉換(「衰變」),以類型的表達式「指針T」 ,表達式的值將是數組的第一個元素的地址。

這意味着,在該語句

cout << greeting << endl; 

表達greetingchar [6]類型的表達式轉換爲char *類型的表達式,表達式的值是所述第一元件的地址。

操作者<<被定義爲使得如果它接收char *類型的參數,這將寫出的流序列在該地址開始直到它看到0終止字符;這裏是一個簡單的例子,它可能如何工作:

std::ostream& operator<<(std::ostream& s, char *p) 
{ 
    while (*p) 
    s.put(*p++); 
    return s; 
} 

真正的算子定義會稍微複雜一些,但這是基本思想。

如果你想打印出來只是greeting第一個字符,必須明確指標或取消對它的引用:

cout << greeting[0] << endl; 

cout << *greeting << endl; 
1

如果你想看到的地址值寫入

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; 
cout << "Greeting message: "; 
cout << (void*)greeting << endl; 
    // ^^^^^^^ 

std::ostream& std::operator<<(std::ostream&, T type);提供專門爲const char*const char[]char類型。

0

是的,這裏的問候語是指向數組中的第一個元素的指針,所以如果你這樣做: cout < < * greeting; 輸出將是H. 但實際上,當您將它傳遞給cout對象時,它足夠聰明地知道greeting不僅僅是一個指針,而且更多的是根據處理中操作符重載的內部實現的字符串。 所以這不是問題,只是cout能理解它。