面试时,问及const的含义,很多人会答:"const表示常量",这可不是考英文翻译,const应该更近似"只读"而不是常量。
const语法
    对非指针变量,const无论放在类型前或后,都表示变量属性为只读,运行过程中不能也不会赋值修改。如const int a;和int const a;这两种方式const作用相同,都表示a是一个常整型数。
    而const修饰指针时则有所不同,分三种情况:const int *a; int * const a; const int const * a;
    const int* a表示a是指向只读整型数的指针,即内存*a中的整数只读,不能被修改,但指针a可以指向其它地址。

int* const a;表示a是指向整型数的只读指针,即:指针指向的整型数可修改,但指针a本身不能修改,不能再指向其他地址。

const int const * a;表示a是指向只读整型数的只读指针,指针指向的整型数不可修改,指针也不可修改。
    有人会有疑问,变量或指针是否修改由程序员自己控制,即使不用const也不影响程序功能实现,为什么要引入它呢?
const的作用
    1) const对外传达有用信息,某变量为const表明在后续代码中不会被修改。所以代码里合理加入const能提高可读性,当然前提是要能看得懂这个暗示,否则就是对牛弹琴了。
    2) const能借助编译器保护那些不希望被改变的变量,防止误修改。一旦声明为const,后面代码中如果试图修改,编译器会报错提醒。这样可以减少bug,提高稳定性。
    3) const可以给编译器一些附加信息,使它产生更高效的优化代码。编译器如果知道某变量只读,值不会改变,就可以利用这一点有针对性做一些优化。
    4) 某些编译器不支持rwdata段(即不支持全局变量),可用const把全局数据定位到rodata段。另外rodata段的数据可直接在多进程间共享,提高空间利用率且无需同步。
const与常量
    回到开始的问题,const和常量是否一回事?不是。常量没有存储空间,是右值。而const的修饰对象依然是左值,有存储空间,只不过被限定到只读空间,这和常量有本质不同。C89中左值定义:“对象是一个命名的存储区域,左值是引用某个对象的表达式”。也就是说有具体存储空间的对象的表达式,就是一个左值!比如const修饰的变量是左值,而相对的,数组名是右值。
    另外为防止指针指向的常量被“曲线”修改,C对于指针间赋值有一个规定:左值必须包含右值所有的限定词。这就限定指向const对象的指针不能赋给指向非const对象的指针,反过来允许。这理所当然,要不,换个指针就能修改原来定义为const的数据:
    const int *p1 =10;
    int *p2;
    p2 = p1;      //这种赋值被禁止,想来也是,制定C标准不可能留下这么大个漏洞
    *p2 = 100;

总结:代码里看到const就象开车看到了单行道标志,利用好它会感觉顺畅,否则会觉得被束缚。一般来说,只要能确定元素为只读,const有益无害。

补遗篇之单行道标志const相关推荐

  1. “睡服”面试官系列第一篇之let和const命令(建议收藏学习)

    目录 1let命令 1.1基本用法 1.2for循环小案例 1.3不存在变量提升 1.4暂时性死区 1.5不允许重复声明 2块级作用域 2.1为什么需要块级作用域? 2.2ES6 的块级作用域 2.3 ...

  2. Redis看这一篇就够了

    大数据时代NoSQL开始大行其道,其中常用于缓存的Redis可谓风头正盛,是大小公司技术架构中必不可少的一种中间件,也是职场技术同仁们必知必会的一种技术.本场Chat将从各个方面对Redis进行全面的 ...

  3. C++:22 再议const的作用(上)

    我在C++:18篇里说过const的用法,这里我有必要再提升进阶下const的理解. 因为你可能只知道他是怎么用的,但是他为什么这样用,其他用法呢? 首先回顾下const有什么主要的作用? (1)可以 ...

  4. FreeRTOS源码分析与应用开发07:事件标志组

    目录 1. 概述 2. 事件标志组类型 3. 创建事件标志组 4. 删除事件标志组 5. 设置事件标志位 5.1 任务级设置 5.2 中断级设置 6. 清除事件标志位 6.1 任务级清除 6.2 中断 ...

  5. 黑猫带你学UFS协议第1篇:全网最全UFS协议中文详讲,这份学习框架图,你值得拥有!!!(持续更新中...)

    文/黑猫学长 1 作者想说 笔者本人从事于存储芯片行业多年,对eMMC/UFS/SD等芯片有深入研究,协议尤甚.而今看来,UFS协议在整个存储产品中(包括U盘.SPI.SD卡,NM卡.emmc.SSD ...

  6. 汇编 标志寄存器 和寻址方式

    原文链接: 汇编 标志寄存器 和寻址方式 上一篇: pyecharts 简单使用 下一篇: 汇编 转移指令 标志位简介: 标志寄存器,又称程序状态寄存器(它的内容是Program Status Wor ...

  7. SQL Server 跟踪标志 3226

    在 SQL Server 中,您可能不知道数据库备份消息的一个默认行为.默认情况下,每个数据库成功备份都会在 SQL Server 错误日志中记录一条消息.对所有备份类型.所有数据库都会发生这种情况. ...

  8. 灵活而奇特的C++语言特性——const(一)

    学习了博主的<漫谈继承技术>系列博文之后,相信大家都有所收获吧!这次博主将和大家一起探讨 <灵活而奇特的C++语言特性> ,主要包括引用.常量(const).常量表达式(con ...

  9. OpenCV4 快速入门 (学习笔记 全)

    第1章 基础知识 1.1 基础结构介绍 作者博客https://blog.csdn.net/shuiyixin?type=blog https://blog.csdn.net/shuiyixin/ar ...

  10. 菜鸟学算法——动态规划(二)

    概述 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法,它是应用数学中用于解决某类最优化问题的重要工具.20世纪 ...

最新文章

  1. Science:人类在实验室创建了微型“大脑”,含祖先基因的那种
  2. python的protected和private
  3. Zookeeper命令行操作(常用命令;客户端连接;查看znode路径;创建节点;获取znode数据,查看节点内容,设置节点内容,删除节点;监听znode事件;telnet连接zookeeper)
  4. python出现的次数最多的元素_Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算...
  5. js浏览器回到顶部方法_基于JS实现回到页面顶部的五种写法(从实现到增强)
  6. layoutIfNeeded 就这样把我害惨
  7. Android Native报错定位(addr2line工具的使用)
  8. java.sql.SQLException: 列名无效
  9. MVC 原理和框架图
  10. awgn matlab,Matlab实现加性高斯白噪声信道(AWGN)下的digital调制格式识别分类
  11. 本地SecureCRT连接VMware中XUbuntu
  12. html5 LivePlayer 实时播放rtmp
  13. JavaScript进阶 | DOM
  14. Gauss数据库初识
  15. lnmp单独安装php,lnmp 环境,再单独安装php7.2 的版本,多版本php 同时运行
  16. Linux系统目录简单说明
  17. freecommander 快捷键列表 zz
  18. 图像平移 VS+opencv+C++
  19. 使用bigdecimal来保留小数
  20. zz纯数学课程科目与教材推荐

热门文章

  1. 贝叶斯网络之父Judea Pearl力荐、LeCun点赞,这篇长论文全面解读机器学习中的因果关系
  2. 最新彻底禁止win10自动更新
  3. 离散数学之数理逻辑——第2章 命题逻辑等值演算
  4. git bash粘贴快捷键
  5. 上焦如雾实际上是指何项作用_广西中医药大学赛恩斯新医药学院《中医基础理论》期考试卷卷16...
  6. uint16 累加_在一个驱动程序中看到uint16,uint32,unit8,int8是什么意思?有何作用?...
  7. 2017、2018年JS面试题记录分享
  8. JavaSE(8)-细节狂魔:21k字长篇深入理解类和对象
  9. linux下安装飞信机器人教程
  10. email邮箱格式校验