首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 指針輸出陷阱:為什麼 cout << char* 輸出字符串而非地址?

     編輯:程式設計綜合問答

現象復現

char *a, *b; a = &ch1; b = &ch2;
cout << a << " " << b << endl; // 輸出 "I Q" 而非地址

根本原因

std::ostream 為 char* 提供了專門的重載運算符 operator<<(const char*),默認行為是**將其視為 C 風格字符串(以空字符結尾)輸出內容**,而非輸出指針地址。這是為了方便直接打印字符串字面量和字符數組。

正確輸出地址的方法

cout << static_cast<const void*>(a) << " " << static_cast<const void*>(b) << endl;
// 或
cout << (void*)a << " " << (void*)b << endl;
// 或 C++17
cout << std::addressof(ch1) << " " << std::addressof(ch2) << endl;

強制轉換為 void* 會匹配 operator<<(const void*),輸出十六進制地址值。

其他類型指針對比

  • int*、double* 無專用重載,匹配 const void* 版本,直接輸出地址。
  • char*、signed char*、unsigned char* 觸發字符串輸出版本。

最佳實踐

  • 調試輸出地址時,統一用 static_cast<void*>(ptr) 或 std::addressof。
  • 若確需打印字符指針指向的字符串,直接用 cout << ptr;若字符串可能不以 \0 結尾,用 cout.write(ptr, len)。

理解標準庫的重載決策規則,能避免此類「明明是指針卻輸出內容」的困惑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved