const 在 C 和 C++ 中的區別
阿新 • • 發佈:2022-04-18
1 C 中的 const 記憶體分配
1.1 修飾全域性變數
#include<stdio.h> const int n = 5; int main(){ int* p = (int*)(&n); *p = 10; printf("%x\n", &n); printf("%x\n", p); printf("%d\n", n); printf("%d\n", *p); return 0; }
C語言中const修飾的全域性變數分配在只讀資料區中,所以當通過指標去修改值時會發生段錯誤:
1.2 修飾區域性變數
#include<stdio.h> int main(){ const int n = 5; int* p = (int*)(&n); *p = 10; printf("%x\n", &n); printf("%x\n", p); printf("%d\n", n); printf("%d\n", *p); return 0; }
在上面的程式碼中,const 修飾的 n 是一個區域性變數,所以分配在棧區,可以通過指標去修改其值。
2 C++ 中的 const 記憶體分配
在C++中,用const修飾的常量會被寫入符號表 中,如果出現了以下兩種情況,則會為它分配記憶體空間:
- 對 const 常量使用了 extern,需要在其他檔案中使用
- 對 const 常量使用了 & 操作符,要取地址
#include<iostream> const int n = 5; int main(){ int* p = (int*)(&n); *p = 10; printf("%x\n", &n); printf("%x\n", p); printf("%d\n", n); printf("%d\n", *p); return 0; }
現在這段程式碼中 n 的輸出結果依然是 5 :
但是如果 n 是一個區域性變數,n 的輸出依然是 5 ,但是 *p 的輸出會變為 10。
References: