2015-01-26 96 views
7
string a = "asdf"; 
cout<<&a[0]; 
cout<<a[0]; 

爲什麼這兩個輸出不同?爲什麼&a[0]不是地址,而是整個字符串?字符串中的[0]和&a [0]之間的區別

+0

你所得到的基本' char *'在該字符串中詳細解釋[answer](http://stackoverflow.com/a/4152881/2458319) – mty 2015-01-26 23:25:54

回答

13

&a[0]有型號char *。流運算符<<故意超載參數const char *以輸出以該地址開始的以零結尾的字符串(C樣式字符串)。例如。如果你這樣做

const char *p = "Hello World!"; 
cout << p; 

它是的<<重載版本,使得確保"Hello World!"字符串本身被髮送到輸出,而不是指針值。

這正是你的代碼輸出整個字符串的原因。由於C++ 11 std::string對象需要將其數據存儲爲零終止字符串,並且&a[0]不是指向存儲在a對象內的字符串開頭的指針。

+0

附錄:使用'&a [0]'而不是'a'的性能較差,不能應付嵌入式零... – Deduplicator 2015-01-26 23:29:56

1

當打印指向標準庫輸出流的指針時,如果它是char*const char*,則會打印指向的以null結尾的字符串,而不是地址本身。如果你想擁有的地址印:

cout << static_cast<const void*>(&a[0]); 

(花絮:如果指針類型爲無法轉換爲const void*要麼---因爲它是一個函數指針或爲成員或者是volatile-- - 然後將其轉換爲bool。)

1

&a[0]收益類型char*。這是operator<<()過載的類型。該特定的重載打印從地址開始的字符,直到找到空字符'\0'。它不會像你期望的那樣打印地址。

由於您所需要的地址,有標準庫的std::addressof()

std::cout << std::addressof(a[0]); 

你也可以轉換爲void*這幾乎是像上面的變種:

std::cout << static_cast<void*>(&a[0]); 
+0

'std :: addressof(a [0])'與這裏的&a [0]'完全相同,對嗎? – 2015-01-27 01:30:32

+0

@MattMcNabb是的,它們都具有相同的效果。但'std :: addressof()'不會考慮爲用戶定義的類型重載'operator&'。 – 0x499602D2 2015-01-27 01:32:16

相關問題