2010-07-30 47 views
2

承擔使用指針與char變量

char a='s'; 

現在我想變量a的地址存儲在字符指針p

char *p=&a; 

如果我使用cout << p;然後我得到的值s,而不是地址!

任何人都可以解釋爲什麼是這樣嗎?

回答

8

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。

+4

肯尼沒有給他的第一句話解釋? – codymanix 2010-07-30 11:31:57

+1

@codymanix現在有一個鏈接,當我投票沒有。鏈接是完美的,但他寫的是垃圾。 'char *'不是專門用於字符串,什麼都不做。他寫道,它輸出的東西是絕對錯誤的。對於char *,我可以保存每個我想要的字節數組。這個問題的正確答案是運營商。這就是原因。現在我只是在大笑,這個無意義的答案能夠獲得高評價 – Gaim 2010-07-30 11:36:05

+0

@gaim不,它不是垃圾,它只是以一種令人困惑的方式編寫的,但是char *的<<運算符專門用來將它視爲一個以null結尾的字符串。真的,爲此降低投票有點荒謬,只是在評論中注意到他的句子構造有點混亂。 – KillianDS 2010-07-30 11:39:33

-1

在C/C++中,指向char的指針通常用作指向以空字符結尾的字符串的指針。運算符處理這個常見用例。

1

調用cout << p是類型安全的(C++對象和運算符),因此它使用char *運算符。這個操作符用於打印保存在字符指針中的字符串。它接收地址並打印從開始到第一次出現字節零的所有內容。如果您使用的是MS窗口,那麼它可能只是這一個字符,因爲這個系統會將內存零化,所以很快就會有零字節。如果要打印地址,請嘗試cout << (void *)p;

+0

謝謝你們,我明白了! – 2010-07-30 13:28:33

+0

不要強制轉換爲int來打印出'char *'的實際指針值,因爲這可能導致在64位應用程序中截斷輸出。將其轉換爲'void *'代替。 – 2010-07-30 13:43:21

+0

@Mark好的,謝謝 – Gaim 2010-07-30 13:54:32

0

在C a char*中通常用於指向(以空字符結尾的)字符串的開頭。爲了使C++ IO流(如cout)與此習慣兼容,有一個operator<<()超負荷版本用於處理char指針。該運算符僅打印出從給定地址開始的以空字符結尾的字符串。

如果你想打印出指針的「價值」(請注意,它不是一部分的C/C++標準是什麼一個指針很像'),轉換指針到void*

std::cout << static_cast<void*>(charpointer); 
+0

謝謝你總結我們寫的東西。 – Gaim 2010-07-30 12:16:51

0

以上許多答案告訴你,< <運算符被重載以處理char *作爲C類型的字符串,即以NULL結尾的字符數組。在你打印p的情況下,它被視爲C字符串,並且所有字符被打印,直到第一個NULL字符被打印。如果您僅獲得s,則會在內存中緊鄰您的變量a旁邊有一個NULL字符。但是,這種行爲可能會根據內存內容而改變。我猜你正在聲明一個全局變量,因爲全局變量的空間通常被初始化爲全零。

另外,這將是一個有趣的實驗,你要聲明兩個字符變量,然後cout那裏的指針與上面一樣。我的猜測是指向第一個變量的指針將會打印它們兩個。