const 在 C 和 C++ 中的区别
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: