在.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常量的地址分配内存空间;

长按解锁

解锁更多精彩内幕

依法编程

微信:Lightspeed-Tech

技术驱动生活

C++笔记十七:C语言中 “冒牌货”const和const符号表的更多相关文章

  1. C语言中无符号数和有符号数之间的运算

    C语言中无符号数和有符号数之间的运算 C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. un ...

  2. R语言学习笔记1——R语言中的基本对象

    R语言,一种自由软件编程语言与操作环境,主要用于统计分析.绘图.数据挖掘.R本来是由来自新西兰奥克兰大学的Ross Ihaka和Robert Gentleman开发(也因此称为R),现在由“R开发核心 ...

  3. C语言学习笔记:15_c语言中的进制操作.c

    /* * 15_c语言中的进制操作.c * * Created on: 2015年7月5日 * Author: zhong */ #include <stdio.h> #include & ...

  4. 【R笔记】R语言中的字符串处理函数

    内容概览 尽管R是一门以数值向量和矩阵为核心的统计语言,但字符串同样极为重要.从医疗研究数据里的出生日期到文本挖掘的应用,字符串数据在R程序中使用的频率非常高.R语言提供了很多字符串操作函数,本文仅简 ...

  5. c语言中为什么左移不分符号数无符号数,而右移分呢??

    因为在C语言标准中,只规定了无符号数的移位操作是采用逻辑移位(即左移.右移都是使用的逻辑左移和逻辑右移).而对于有符号数,其左移操作还是逻辑左移,但右移操作是采用逻辑右移还是算术右移就取决于机器了!( ...

  6. 《Algorithms 4th Edition》读书笔记——3.1 符号表(Elementary Symbol Tables)-Ⅱ

    3.1.2 有序的符号表 典型的应用程序中,键都是Comparable的对象,因此可以使用a.compare(b)来比较a和b两个键.许多符号表的实现都利用Comparable接口带来的键的有序性来更 ...

  7. 《OOC》笔记(1)——C语言const、static和extern的用法

    <OOC>笔记(1)——C语言const.static和extern的用法 C语言中const关键字用法不少,我只喜欢两种用法.一是用于修饰函数形参,二是用于修饰全局变量和局部变量. 用c ...

  8. sqlite学习笔记7:C语言中使用sqlite之打开数据库

    数据库的基本内容前面都已经说得差点儿相同了.接下看看如何在C语言中使用sqlite. 一 接口 sqlite3_open(const char *filename, sqlite3 **ppDb) 打 ...

  9. C语言中关键字auto、static、register、const、volatile、extern的作用

    原文:C语言中关键字auto.static.register.const.volatile.extern的作用 关键字auto.static.register.const.volatile.exter ...

随机推荐

  1. JQuery之DOM操作及常用函数

    属性操作 attr(name)获取属性值 var imgSrc = $("img").attr("src") attr(name,value)设置属性值 $(& ...

  2. Android开发小问题集

    由于安卓系统比较复杂,开发中会发中会碰见各种小问题,在此做一些记录,只要觉得有必要就会添加进来. 1.触屏鼠标模式和触屏模式 开发android4.3高通400平台时,用atmel_max 640T作 ...

  3. Uva - Uva272 - TEX Quotes

    TeX is a typesetting language developed by Donald Knuth. It takes source text together with a few ty ...

  4. html5配合css3实现带提示文字的输入框(摆脱js)

    来源:互联网 作者:佚名 时间:03-08 11:41:53 [大 中 小] webkit特有的一个css,可以控制里面的文字样式,配合css3的动画效果和伪类,我们就可以很容易做出一个带动画的输入框 ...

  5. MVPHelper更新日志 --- 新增常规分包模式

    MVPHelper是一款可以自动生成MVP接口以及实现类的android studio插件,彻底解放双手! MVPHelper更新版本啦. 由于之前只支持contract模式,不是很符合大众口味 所以 ...

  6. 当freemarker中EL表达式的值为空时出现异常的解决方法

     <#list pageView.list as msg>      <form name="msgForm" id="msgForm" ...

  7. UNIX环境高级编程——select、poll和epoll

    一.select select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,事实上从现在看来,这也是它所剩不多的优点之一. select的一个缺点在于单个进程能够监视的文件描述符的数量 ...

  8. (NO.00003)iOS游戏简单的机器人投射游戏成形记(十九)

    如果看过前面博文的童鞋可能记得,我们在Level1中是通过写代码实现篮筐的走位.写代码不够直观,需要反复编译测试,有没有其他的方法呢? 答案自然是:大大的有 ;) SpriteBuilder宝贝自身已 ...

  9. javascript之prototype原型属性

    这个地方有点绕,仔细理解代码的意义. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...

  10. 小强的HTML5移动开发之路(14)——Video标签详解

    来自:http://blog.csdn.net/dawanganban/article/details/18180605 在前面的小强的HTML5移动开发之路(5)--制作一个漂亮的视频播放器中制作了 ...