C++笔记017:C语言中 “冒牌货”const和const符号表

 


 原创笔记,转载请注明出处!

 点击【关注】,关注也是一种美德~ 


 

在.c文件中有程序:

int main()

{

int const a = 10;

a=20;

printf("a=%d\n",a);

return 0;

}

 

编译就知道C语言编译器会报错,说变量a是常量,常量是不能当左值的,这样看来,好像a是定义的一个常量,不能修改!

 

修改程序:

int main()

{

int *p;

int const a=10;

 

p=(int*)&a;

*p=20;

 

printf("a=%d\n",a);

 

return 0;

}

 

定义一个指向变量a的指针变量p,通过指针修改指针p所指向位置的值,也就是a的值,编译运行:

a=20

Press any key to continu

 

我们发现a的值变成了20,被修改了!

也就是说我们通过指针间接修改了a的值,也就是说在c语言中const是个“冒牌货”。

 

同样的代码,我们运行在C++环境下:

int main()

{

int *p;

int const a=10;

 

p=(int*)&a;

*p=20;

 

printf("a=%d\n",a);

 

system("pause");

return 0;

}

 

运行结果:

啊0

请按任意键继续...

 

发现运行结果跟C语言环境不同,在C++中并没有改变变量a的值。

所以,在C++中,const是一个真正的常量。

 

问题原因分析:

因为C++编译器对const做了加强,当C++编译器扫描到const常量声明时,它不会像C语言一样为const单独分配内存。

在C++中,int const a = 10;之后,C++编译器会将a放到一个符号表里面,符号表的存在形式:

我们定义常量a=10,key就是a,value就是10,这个值就是锁死了,不能变的,当使用a的时候,就会从符号表里面把10拿出来。

当对a变量取地址的时候,C++编译器会为a单独的开辟一块内存空间,p = (int *)&a;然后这个内存空间赋给指针p,就是p指向这个内存空间。

 

通过*p去间接修改的值,是这个新开辟的内存空间的值,而不是符号表中a的值,我们让*p=20、30、100…修改的都是新开辟内存空间中的值。我们可以通过打印*p去验证这两个区域并不是一回事。

int main()

{

int *p;

int const a=10;

 

p=(int*)&a;

*p=20;

 

printf("a=%d\n",a);

printf("*p=%d\n",*p);

 

system("pause");

return 0;

}

 

运行结果:

a=10

*p=20

请按任意键继续...

 

 

结论

C语言中的const变量

C语言中的const变量是只读变量,有自己的存储空间。

C++中的const变量

可能分配存储空间,也可能不分配存储空间;

当const常量为全局,并且需要在其它文件中使用时分配内存空间;

当使用&操作符取const常量的地址分配内存空间;

 

 

 


  原创笔记,转载请注明出处!

 更多精彩请关注微信公众号:依法编程


 

posted @ 2018-05-03 15:28  tyyhmtyyhm  阅读(689)  评论(0编辑  收藏  举报