char a='s';
現在我想變量a的地址存儲在字符指針p
char *p=&a;
如果我使用cout << p;
然後我得到的值s,而不是地址!
任何人都可以解釋爲什麼是這樣嗎?
char a='s';
現在我想變量a的地址存儲在字符指針p
char *p=&a;
如果我使用cout << p;
然後我得到的值s,而不是地址!
任何人都可以解釋爲什麼是這樣嗎?
basic_ostream
的<<
運算符是專門爲const char*
參數*輸出它像一個C字符串**。有關更多詳細信息,請參閱the answer to Why does cout print char arrays differently from other arrays?。
基本上,打印時可以將p
轉換爲void*
以獲取地址。
cout << static_cast<void*>(p);
*:也const charT*
其中charT
是由basic_ostream
,和const unsigned char*
和const signed char*
如果charT == char
採用的字符類型。例如,wcout
會將const wchar_t*
視爲(寬)C字符串,但cout
會將其視爲指針。
**:這可以通過basic_ostream
使用的字符特徵進行過濾。有關詳細算法,請參見C++標準§ [ostream.inserters.character]/4。
在C/C++中,指向char的指針通常用作指向以空字符結尾的字符串的指針。運算符處理這個常見用例。
調用cout << p
是類型安全的(C++對象和運算符),因此它使用char *運算符。這個操作符用於打印保存在字符指針中的字符串。它接收地址並打印從開始到第一次出現字節零的所有內容。如果您使用的是MS窗口,那麼它可能只是這一個字符,因爲這個系統會將內存零化,所以很快就會有零字節。如果要打印地址,請嘗試cout << (void *)p;
謝謝你們,我明白了! – 2010-07-30 13:28:33
不要強制轉換爲int來打印出'char *'的實際指針值,因爲這可能導致在64位應用程序中截斷輸出。將其轉換爲'void *'代替。 – 2010-07-30 13:43:21
@Mark好的,謝謝 – Gaim 2010-07-30 13:54:32
在C a char*
中通常用於指向(以空字符結尾的)字符串的開頭。爲了使C++ IO流(如cout
)與此習慣兼容,有一個operator<<()
超負荷版本用於處理char
指針。該運算符僅打印出從給定地址開始的以空字符結尾的字符串。
如果你想打印出指針的「價值」(請注意,它不是一部分的C/C++標準是什麼一個指針很像'),轉換指針到void*
如
std::cout << static_cast<void*>(charpointer);
謝謝你總結我們寫的東西。 – Gaim 2010-07-30 12:16:51
以上許多答案告訴你,< <運算符被重載以處理char *作爲C類型的字符串,即以NULL結尾的字符數組。在你打印p的情況下,它被視爲C字符串,並且所有字符被打印,直到第一個NULL字符被打印。如果您僅獲得s,則會在內存中緊鄰您的變量a旁邊有一個NULL字符。但是,這種行爲可能會根據內存內容而改變。我猜你正在聲明一個全局變量,因爲全局變量的空間通常被初始化爲全零。
另外,這將是一個有趣的實驗,你要聲明兩個字符變量,然後cout那裏的指針與上面一樣。我的猜測是指向第一個變量的指針將會打印它們兩個。
肯尼沒有給他的第一句話解釋? – codymanix 2010-07-30 11:31:57
@codymanix現在有一個鏈接,當我投票沒有。鏈接是完美的,但他寫的是垃圾。 'char *'不是專門用於字符串,什麼都不做。他寫道,它輸出的東西是絕對錯誤的。對於char *,我可以保存每個我想要的字節數組。這個問題的正確答案是運營商。這就是原因。現在我只是在大笑,這個無意義的答案能夠獲得高評價 – Gaim 2010-07-30 11:36:05
@gaim不,它不是垃圾,它只是以一種令人困惑的方式編寫的,但是char *的<<運算符專門用來將它視爲一個以null結尾的字符串。真的,爲此降低投票有點荒謬,只是在評論中注意到他的句子構造有點混亂。 – KillianDS 2010-07-30 11:39:33