首先来看一个例子:
在C语言编译器和C++编译器中编译这段代码,看最后输出的结果。
int a = 10;
const *p = &a;
*p = 20;
printf("a = %d\n", a);
在C中运行的结果
a = 20
在C++中运行的结果
a = 10
为什么会导致在结果不同呢?
因为两者对const的处理机制不同。
C语言中对const的处理是这样的:在编译的时候遇到const变量时,是不会给这个变量单独分配空间的。
C++中遇到const变量,就会将原来的变量存到一个符号表中,这个时候会给这个变量单独分配一个内存空间,就拿上面的例子来说,编译器会把原来的a变量和它的值存放到一个符号表中,并且给a单独分配一个空间,让p指向这个空间,所以给*p赋值就是给这个新的空间赋值,与原来的a没有任何关系。
图示就是下面这样
一切对p进行的操作就是在新分配的空间中执行的,对原来的a没有关系,也不会改变a的值,所以C++中的const是真正的常量。
【注意】:c++中const可能会分配空间也可能不会分配空间
1、在const常量为全局的时候,并且在其他文件中需要用到这个常量的时候就会分配空间。
2、当使用&操作符取const常量地址的时候会分配空间
以上是我个人的理解,如有错误欢迎指正。