在C++中const是一个真的常量,但是C语言中const是一个假的常量
const int a = 10;
int *p = (int *)&a;
*p = 20;
printf("a = %d\n",a);
上述代码在C语言中,a = 20,但是C++ 中 a = 10;
c++中定义const时候,a放入到符号表中使用,当定义p指向a的时候,C++重新为a分配了一个空间,将p指向了新的a的空间,从而修改p的值,和新空间中a的值,但是符号表中a的值没有发生变化,如下图所示:
const 和#define 区别
1、const 常量有数据类型,因此有类型安全检查,而宏#define是没有的。宏仅仅是替换,预处理过程会把源代码出现宏标识符替换成宏定义时的值。
2、有些集成化的调试工具能对const常量进行调试,对宏常量不能调试。
3、const定义的常数是变量,带类型,但是#define定义的只是个常数,不带类型
4、const是在编译运行时候起作用,define是在编译的预处理阶段起作用
我们来看下面这块代码
int a, b;
a = b = 5;
int array[a + b];
// 这在Windows下C语言和C++都是不能实现的,但是Linux的内核的gcc支持
const int a = 5;
const int b = 5;
int array[a + b];
//在C语言中是不支持的,但是C++中是支持的,
//在这里,C++中const实现和#define是一样的
void fun()
{
#define c 10
const d = 20;
}
void fun1()
{
//在这里c是可以执行的,因为预编译为10,但是d不可以 //const有作用域
printf("%d,%d\n",c,d);
}
结论:
C语言中的const是只读变量,存在自己的空间。
C++中const可能分配空间,可能不分配空间,当使用&取地址符的时候,才会分配空间。或当定义const为全局变量时候,被其他文件使用的时候,分配空间,const分配内存的时机:编译器编译时间