我所遇到的一個C++代碼:我堅持串和陣列
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
cout << "Greeting message: ";
cout << greeting << endl;
輸出:Hello
由於問候是大小爲6的陣列,顯示問候應該只顯示「H」,因爲greeting[0]
in cout
,因爲它顯示的是數組的第一個地址。我不知道我錯在哪裏。
我所遇到的一個C++代碼:我堅持串和陣列
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
cout << "Greeting message: ";
cout << greeting << endl;
輸出:Hello
由於問候是大小爲6的陣列,顯示問候應該只顯示「H」,因爲greeting[0]
in cout
,因爲它顯示的是數組的第一個地址。我不知道我錯在哪裏。
greeting
decays to a pointer本身。但是,如果聽起來很複雜,你可以將它看作是一個指標,以瞭解cout
做什麼。
cout
方法打印字符從greeting[0]
開始,直到\0
。
我已經得到它的感謝! –
除了當它是sizeof
或一元&
運營商的操作數,表達型「N
的T
- 元素陣列」的將被轉換(「衰變」),以類型的表達式「指針T
」 ,表達式的值將是數組的第一個元素的地址。
這意味着,在該語句
cout << greeting << endl;
表達greeting
從char [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;
如果你想看到的地址值寫入
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
類型。
是的,這裏的問候語是指向數組中的第一個元素的指針,所以如果你這樣做: cout < < * greeting; 輸出將是H. 但實際上,當您將它傳遞給cout對象時,它足夠聰明地知道greeting不僅僅是一個指針,而且更多的是根據處理中操作符重載的內部實現的字符串。 所以這不是問題,只是cout能理解它。
請說明爲什麼您期望它只顯示「H」。您正在打印'問候'而不是'問候[0]' – vu1p3n0x
'問候'衰變成一個指針'char *'並且它所指向的整個字符串將被打印。如果您只想打印第一個字符,請使用'cout << greeting [0] << endl;'。 – Unimportant
這是如何cout顯示字符串...因爲問候語是一個字符串,這就是爲什麼cout顯示「你好」,但如果你寫「問候[0]」,那麼cout將顯示'H'作爲字符... – Shiv