const 是constant 的缩写,是恒定不变的意思,也翻译为常量、常数等。很不幸,正是因为这一点,很多人都认为被const 修饰的值是常量。这是不精确的,精确的说应该是只读的变量,其值在编译时不能被使用,因为编译器在编译时不知道其存储的内容。或许当初这个关键字应该被替换为readonly。那么这个关键字有什么用处和意义呢?

const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。我们看看它与define 宏的区别。(很多人误以为define 是关键字,在这里我提醒你再回到本章前面看看32 个关键字里是否有define)。

一、const 修饰的只读变量

定义const 只读变量,具有不可变性。例如:
   const intMax=100;
   intArray[Max];
这里请在Visual C++6.0 里分别创建.c 文件和.cpp 文件测试一下。你会发现在.c 文件中,编译器会提示出错,而在.cpp 文件中则顺利运行。为什么呢?我们知道定义一个数组必须指定其元素的个数。这也从侧面证实在C 语言中,const 修饰的Max 仍然是变量,只不过是只读属性罢了;而在C++里,扩展了const 的含义,这里就不讨论了。

注意:const 修饰的只读变量必须在定义的同时初始化,想想为什么?

留一个问题:case 语句后面是否可以是const 修饰的只读变量呢?请动手测试一下。

二、节省空间,避免不必要的内存分配,同时提高效率

编译器通常不为普通const 只读变量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高。例如:
   #define M 3 //宏常量
   const int N=5; //此时并未将N 放入内存中
   ......
   int i=N; //此时为N 分配内存,以后不再分配!
   int I=M; //预编译期间进行宏替换,分配内存
   int j=N; //没有内存分配
   int J=M; //再进行宏替换,又一次分配内存!
const 定义的只读变量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const 定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区),而#define 定义的宏常量在内存中有若干个拷贝。

#define 宏是在预编译阶段进行替换,而const 修饰的只读变量是在编译的时候确定其值。
#define 宏没有类型,而const 修饰的只读变量具有特定的类型。

三、修饰一般变量

一般常量是指简单类型的只读变量。这种只读变量在定义时,修饰符const 可以用在类型说明符前,也可以用在类型说明符后。例如:
   int const i=2; 或const int i=2;

四、修饰数组

定义或说明一个只读数组可采用如下格式:
   int const a[5]={1, 2, 3, 4, 5};或
   const int a[5]={1, 2, 3, 4, 5};

五、修饰指针

const int *p; // p 可变,p 指向的对象不可变
   int const *p; // p 可变,p 指向的对象不可变
   int *const p; // p 不可变,p 指向的对象可变
   const int *const p; //指针p 和p 指向的对象都不可变
在平时的授课中发现学生很难记住这几种情况。 这里给出一个记忆和理解的方法:先忽略类型名(编译器解析的时候也是忽略类型名),我们看const 离哪个近。“近水楼台先得月”,离谁近就修饰谁。
   const int *p; //const 修饰*p,p 是指针,*p 是指针指向的对象,不可变
   int const *p; //const修饰*p,p 是指针,*p 是指针指向的对象,不可变
   int *const p; //const修饰p,p 不可变,p 指向的对象可变
   const int *const p; //前一个const 修饰*p,后一个const 修饰p,指针p 和p 指向的对象都不可变

六、修饰函数的参数

const 修饰符也可以修饰函数的参数,当不希望这个参数值被函数体内意外改变时使用。例如:
   void Fun(const int i);
告诉编译器i 在函数体中的不能改变,从而防止了使用者的一些无意的或错误的修改。

七、修饰函数的返回值

const 修饰符也可以修饰函数的返回值,返回值不可被改变。例如:
   const int Fun (void);

在另一连接文件中引用const 只读变量:
   extern const int i; //正确的声明
   extern const int j=10; //错误!只读变量的值不能改变。

注意这里是声明不是定义,关于声明和定义的区别,请看本章开始处。

讲了这么多讲完了吗?远没有。在C++里,对const 做了进一步的扩展,还有很多知识未能讲完。有兴趣的话,不妨查找相关资料研究研究。

C语言const关键字—也许该被替换为readolny相关推荐

  1. C/C++ 语言 const 关键字

    C/C++ 语言 const 关键字 1. Constants - 常量 ANSI C 允许声明常量,常量的样子和变量完全一样,只是它们的值不能被修改.使用 const 关键字声明常量: const ...

  2. C语言学习及应用笔记之三:C语言const关键字及其使用

    在C语言程序中,const关键字也是经常会用到的一个关键字,那么使用const关键字的目的是什么呢?事实上,在程序中使用const关键字的主要目的就是为了向使用者传递设计者的一些意图. 事实上,无论我 ...

  3. C语言const关键字详解

    C语言的const关键字 const 在实际编程中用得并不多,const 是 constant 的缩写,意思是"恒定不变的"!它是定义只读变量的关键字,或者说 const 是定义常 ...

  4. C语言const关键字与指针

    const关键字与指针 const修饰指针的4种形式 const修饰变量的修改问题 const应该怎么用 const修饰指针的4种形式 const关键字在C语言中还用来修饰变量,表示这个变量是常量,不 ...

  5. c++语言关键字大全,C++语言const 关键字使用方法图文详解

    之前一直在学习C/C++,关于const的使用,这里出现一点,那里出现一点.知识用时方恨少,这一段时间正好各种笔试题,其中关于const的用法也是层出不穷,所以疲于在书本上各种翻,这里汇总一下,加深自 ...

  6. C语言const 关键字

    面试的时候,应该有遇到const相关的,毕竟也是学习中的一个知识点,看完我们这篇文章,我觉得你应该可以在面试中完完全全的吃透const这个点. const和变量 const uint32_t hell ...

  7. c语言中const的作用面试,C语言const关键字作用

    C语言中const代表着"不可变",基本和常量一样不可修改,但是应用场景不一样. 一.应用在变量 const char a='A'; a='B';  //错误,变量a的值不可以修改 ...

  8. const关键字在c语言的作用,C语言const关键字作用

    C语言中const代表着"不可变",基本和常量一样不可修改,但是应用场景不一样. 一.应用在变量 const char a='A'; a='B';  //错误,变量a的值不可以修改 ...

  9. c语言辅助防破写法,陈正冲老师讲c语言之const关键字

    1.const 关键字也许该被替换为 readolny const是constant的缩写,是恒定不变的意思,也翻译为常量.常数等.很不幸,正是因为这一点,很多人都认为被const修饰的值是常量.这是 ...

最新文章

  1. angular.foreach 格式
  2. asp.net多图片上传案例_会计小明的故事-成本核算案例篇
  3. 计算机组装需要的硬件,组装电脑选择硬件,只要记住2个装机思路,选好硬件配置不是难题...
  4. Softmax学习笔记
  5. 如题,用C#语言 如何给下拉列表框动态添加数据?,C#复习题 单项选择题
  6. java操作当前日期的年月日
  7. 新一代人工智能发展规划_助力人工智能创新发展,新华三任合肥市新一代人工智能产业发展联盟理事单位...
  8. lambda表达式java_Lambda表达式Java教程
  9. [html] html的哪个标签可以预渲染?
  10. 从人脸识别到内容审核,百度硬核AI技术推荐!
  11. 数据3分钟丨Gartner宣布明年12大战略性技术趋势;PolarDB-X正式开源;OceanBase 3.2发布...
  12. opencv 从原始的图像中找出ROI区域
  13. 在Rails资产管道中使用字体
  14. 项目心得--我的尺寸测量项目
  15. php 微信H5支付
  16. 使用selenium爬验证码图片并识别
  17. java dvr_java – 如何设置与DVR的连接并解码数据?
  18. diskgenius克隆硬盘无法启动_用Diskgenius克隆分区到另一个磁盘上
  19. 在一个循环中将许多字符串连接在一起时,使用 StringBuilder类可以提升性能
  20. js检测PDF插件 Adobe Reader是否安装

热门文章

  1. 【转】ADO.Net之SqlConnection、 Sqlcommand的应用学习心得(思维导图,知识解析,案例分析)
  2. 【转】刨根究底字符编码之十五——UTF-32编码方式
  3. oracle更新数据没反应,ORACLE更新数据时如果有就更新没有就插入
  4. python怎样定义一个数组_python如何建立全零数组
  5. 公司用的非标普通自动化用单片机还是plc_PLC的介绍
  6. 【Python CheckiO 题解】Feed Pigeons
  7. 【牛客 - 289 I】这是一个沙雕题I (字符串问题,水题)
  8. 详解经典GPS辅助惯性导航论文 A GPS-aided Inertial Navigation System in Direct Configuration
  9. python 导入csv文件到oracle_python将文件夹下的所有csv文件存入mysql和oracle数据库
  10. 人工智能在fpga的具体应用_人工智能带动了FPGA的发展