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:

浙公网安备 33010602011771号