const修饰变量为只读变量,但C和C++中实现机制却不同,详见如下实例:
main.cpp文件
#include <stdio.h>
#include <stdlib.h>
extern "C" {
extern int main1();
}
const int d = 10;
int main()
{
//c++中const修饰变量存放在符号表中,可能会为其分配类似普通变量的
//内存空间,也可能不分配,当要取地址是,要为其分配内存空间,但符号表中
//记录的c仍然为10,*p是新为其分配的内存空间,修改其值并不影响符号表中的值
main1();
const int c = 10;
int * p = (int *)&c;
//以下语句并不能修改c的值,他修改的是p指向的内存空间的值,读c的值时要从符号表中读取
*p = 123;
printf("c = %d\n", c);
printf("*p = %d\n", *p);
p = (int *)&d;
//下面这句话会导致程序崩溃,不能修改只读区的内容
//*p = 123;
printf("d = %d\n", d);
printf("*p = %d\n", *p);
system("pause");
return 0;
}
main2.c文件
#include <stdio.h>
//e编译时存储在只读区
const int e = 10;
int main1()
{
//而这里的c存放在栈区
const int c = 10;
int * p = (int *)&c;
*p = 123;
//通过输出结果我们发现,c语言中const修饰的变量可以通过指针间接被修改,const的作用是假的
printf("c = %d\n", c);
printf("*p = %d\n", *p);
p = (int *)&e;
//下面这句话会导致程序崩溃,不能修改只读区的内容
//*p = 123;
printf("e = %d\n", e);
printf("*p = %d\n", *p);
return 0;
}
由此可见,C++为了保证const的有效性,引入了符号表,避免通过指针间接修改const变量的值。