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

C++ const int 取地址轉非 const 指針:為何需強制類型轉換?

     編輯:程式設計綜合問答

代碼:

const int a = 10;
int *p = (int *)(&a); // 編譯通過(但運行時未定義行為)
int *p = &a;          // 編譯錯誤:cannot convert from 'const int *' to 'int *'

編譯器邏輯

  • &a 類型為 const int*,承諾不通過該指針修改 a。
  • 賦值給 int* 會丟失 const 資格,編譯器禁止**隱式轉換**,防止程序員誤修改常量。
  • 強轉 (int*) 告訴編譯器「我知道我在幹什麼」,繞過檢查,**但運行時修改 *p 導致未定義行為**(可能崩潰、可能靜默失效、可能看似成功)。

為什麼要這樣設計?

  1. 類型安全:const 是契約,防止意外修改只讀內存(如字符串常量區、.rdata 段)。
  2. 優化提示:編譯器可將 const 變量值直接內聯到機器碼,不分配內存。
  3. API 設計:函數參數 const int* 承諾只讀,調用者放心傳遞非常量對象(隱式轉換安全),反之則不安全。

最佳實踐

  • **絕不**通過非常量指針修改 const 對象。
  • 需修改時,去掉定義處 const,或復制一份非常量副本。
  • 接口設計:只讀參數用 const T*,輸出參數用 T*。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved