2014-10-04 65 views
1

我們如何顯示char變量的地址?我發現了一個解決方案,使用類型強制轉換將其轉換爲int或float或void等,然後使用指針顯示地址。但是沒有類型轉換的特定解決方案還有其他選擇嗎?使用像指針使用指針在C++中顯示char變量的地址?

char var = 'a'; 
char* ptr; 
ptr = &var; 
cout << ptr; 

但在這種情況下,即使指針指向var的地址,但顯示var的值。爲什麼?如果它如此,那麼我們如何使用指針獲取var的地址? 不使用型鑄造

cout << "Address of var = " << static_cast<void*>(&var) << endl; 

或者我們重載特定問題的任何操作?

+1

'cout <<(void *)ptr;' – 2014-10-04 09:57:12

+4

類型轉換問題到底是什麼? – 2014-10-04 10:00:10

+0

只是出於好奇 – 2014-10-04 10:17:10

回答

7

,你需要編寫投的唯一原因是因爲std::ostreamchar *一個特殊的過載,其假設給定的指針指向字符的零結尾的數組的第一個元素,並樂意嘗試穿越該數組直到它達到零。

不幸的是,這意味着您不能簡單地傳遞單個字符的地址並且打印該地址的值,這就是爲什麼您需要投射。對於所有其他(非字符)指針,std::ostream已經打印指針值的數字表示。

沒有什麼可以「做」的,但也沒有什麼問題,因爲你已經發現瞭解決方案。如果您處於通用設置並希望打印對象指針,那麼只需將一個強制轉換添加到void *,它將適用於所有輸入類型。 std::ostream的行爲是爲了方便使絕大多數用例可以輕鬆工作而設計選擇的結果,其代價是讓您的特定用例更加冗長地編寫。

+0

我們可以重載char *嗎? – 2014-10-04 10:07:43

+1

@FaisalNaseer:我不明白。當然你知道重載是如何工作的,但問題是'std :: ostream' *已經*有這樣的重載。您不得重新定義標準庫的某些部分。 (你*可能*可能寫你自己的流類,併爲此定義你自己的重載。) – 2014-10-04 10:10:27

+2

我相信這是所有需要說的,@FaisalNaseer你不能用相同的簽名定義兩個重載,除非你計劃使用一個你想要的功能(最後它將是一個類型轉換),你的具體問題沒有意義 – 2014-10-04 10:14:58