有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定。例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小。

为了满足这一要求,可以使用const关键字对变量加以限定:

constint MaxNum=100;//班级的最大人数

这样 MaxNum 的值就不能被修改了,任何对 MaxNum 赋值的行为都将引发错误:

MaxNum=90;//错误,试图向 const 变量写入数据

我们经常将 const 变量称为常量(Constant)。创建常量的格式通常为:

const type name = value;

const 和 type 都是用来修饰变量的,它们的位置可以互换,也就是将 type 放在 const 前面:

type const name = value;

但我们通常采用第一种方式,不采用第二种方式。另外建议将常量名的首字母大写,以提醒程序员这是个常量。

由于常量一旦被创建后其值就不能再改变,所以常量必须在定义的同时赋值(初始化),后面的任何赋值行为都将引发错误。一如既往,初始化常量可以使用任意形式的表达式,如下所示:

运行结果:

100, 90, 80

const 和指针

const 也可以和指针变量一起使用,这样可以限制指针变量本身,也可以限制指针指向的数据。const 和指针一起使用会有几种不同的顺序,如下所示:

constint*p1;

intconst*p2;

int*const p3;

在最后一种情况下,指针是只读的,也就是 p3 本身的值不能被修改;在前面两种情况下,指针所指向的数据是只读的,也就是 p1、p2 本身的值可以修改(指向不同的数据),但它们指向的数据不能被修改。

当然,指针本身和它指向的数据都有可能是只读的,下面的两种写法能够做到这一点:

constint*const p4;

intconst*const p5;

const 和指针结合的写法多少有点让初学者摸不着头脑,大家可以这样来记忆:const 离变量名近就是用来修饰指针变量的,离变量名远就是用来修饰指针指向的数据,如果近的和远的都有,那么就同时修饰指针变量以及它指向的数据。

const 和函数形参

在C语言中,单独定义 const 变量没有明显的优势,完全可以使用#define命令代替。const 通常用在函数形参中,如果形参是一个指针,为了防止在函数内部修改指针指向的数据,就可以用 const 来限制。

在C语言标准库中,有很多函数的形参都被 const 限制了,下面是部分函数的原型:

size_tstrlen(constchar* str);

intstrcmp(constchar* str1,constchar* str2);

char*strcat(char* destination,constchar* source);

char*strcpy(char* destination,constchar* source);

intsystem(constchar* command);

intputs(constchar* str);

intprintf(constchar* format,...);

我们自己在定义函数时也可以使用 const 对形参加以限制,例如查找字符串中某个字符出现的次数:

运行结果:3

根据 strnchr() 的功能可以推断,函数内部要对字符串 str 进行遍历,不应该有修改的动作,用 const 加以限制,不但可以防止由于程序员误操作引起的字符串修改,还可以给用户一个提示,函数不会修改你提供的字符串,请你放心。

const 和非 const 类型转换

当一个指针变量 str1 被 const 限制时,并且类似const char *str1这种形式,说明指针指向的数据不能被修改;如果将 str1 赋值给另外一个未被 const 修饰的指针变量 str2,就有可能发生危险。因为通过 str1 不能修改数据,而赋值后通过 str2 能够修改数据了,意义发生了转变,所以编译器不提倡这种行为,会给出错误或警告。

也就是说,const char *和char *是不同的类型,不能将const char *类型的数据赋值给char *类型的变量。但反过来是可以的,编译器允许将char *类型的数据赋值给const char *类型的变量。

这种限制很容易理解,char *指向的数据有读取和写入权限,而const char *指向的数据只有读取权限,降低数据的权限不会带来任何问题,但提升数据的权限就有可能发生危险。

C语言标准库中很多函数的参数都被 const 限制了,但我们在以前的编码过程中并没有注意这个问题,经常将非 const 类型的数据传递给 const 类型的形参,这样做从未引发任何副作用,原因就是上面讲到的,将 const 类型转换为非 const 类型是允许的。

下面是一个将 const 类型赋值给非 const 类型的例子:

第7、8行代码分别通过赋值、传参(传参的本质也是赋值)将 const 类型的数据交给了非 const 类型的变量,编译器不会容忍这种行为,会给出警告,甚至直接报错。

文章就到这里了,希望对大家有帮助~

学习C/C++编程知识,想要成为一个更加优秀的程序员,或者你学习C/C++的时候有难度,可以来笔者的C语言C++零基础编程学习圈,里面不仅有学习视频和文件源码,还有更多志同道合的朋友,欢迎转行也学习编程的伙伴,和大家一起交流成长会比自己琢磨更快哦!

学习C/C++编程知识,提升C/C++编程能力,欢迎关注笔者学习专栏:

C/C++编程学习聚集地​zhuanlan.zhihu.com

char* 赋值 const char* 释放_C/C++编程笔记:C语言中 const 关键字的作用及解析,值得收藏!...相关推荐

  1. c 获取char*的长度_C/C++编程笔记:C语言字符串比较函数,超详细,值得收藏

    void *memset(void *dest, int c, size_t count); 将dest前面count个字符置为字符c. 返回dest的值. void *memmove(void *d ...

  2. c 获取char*的长度_C/C++编程笔记:C语言字符串比较函数,超详细,值得收藏!...

    前方干货准备!!! void *memset(void *dest, int c, size_t count); 将dest前面count个字符置为字符c. 返回dest的值. void *memmo ...

  3. c++ double 只输出五位_C/C++编程笔记:C语言入门知识点(一),请收藏C语言最全笔记...

    C语言简介 C 语言是一种通用的高级语言,最初是由丹尼斯·里奇在贝尔实验室为开发 UNIX 操作系统而设计的.C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现. 原文链接: ...

  4. c语言数组前const的作用,c语言中const的用法

    C语言作为一门新型高级编程语言,在计算机软件编程中具有较为广泛的应用和实现.下面小编就跟你们详细介绍下c语言中const的用法,希望对你们有用. c语言中const的用法如下: const的基本解释 ...

  5. C语言中const的用法

    C语言中const的用法 基本解释         const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解co ...

  6. C语言中定义常量的关键字是什么,C++_详解C语言中const关键字的用法,关键字const用来定义常量,如 - phpStudy...

    详解C语言中const关键字的用法 关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const ...

  7. const在c语言中作用,在C语言中const作用全面总结.doc

    在C语言中const作用全面总结 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助.Const 是C++中常 ...

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

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

  9. 在单片机C语言中const是什么意思

    在单片机C语言中const unsigned char ov529[5]={0xff,0xff,0xff,SYNC_ID,0x00}前面加const是什么意思?? 表示常量,不允许修改里面的内容.也就 ...

最新文章

  1. 瑞尔森大学的计算机科学专业,瑞尔森大学有哪些专业处于世界顶尖水平?
  2. leetcode day1 -- Reverse Words in a String Evaluate Reverse Polish Notation Max Points on a Li
  3. 【算法基础】数据结构导论第五章-图.pptx
  4. js构造函数的浅薄理解
  5. 千万不要这样写代码!9种常见的OOM场景演示
  6. 《天天数学》连载15:一月十五日
  7. Hive查看表的分区字段
  8. 04SpringMvc_映射器_BeanNameUrlHanderMapping
  9. 一:HTML文本编译器 kindeditor-4.1.10 的使用 SpringMVC+jsp的实现
  10. python标准库——math模块
  11. openstack项目_新项目,安全性以及更多OpenStack新闻
  12. ICP算法进行点云配准
  13. web自动化测试-第一讲:selenium快速入门
  14. iOS开发:GitHub上传代码错误提示fatal: Authentication failed for 'https://gitee.com/XXX/XXX.git/‘的解决方法
  15. 对啊英语音标---一、什么是字母的名称音和发音
  16. vue3基础 —— 子传父
  17. visio 2010如何激活
  18. 锂矿降龙十八掌之时乘六龙:盛新锂能
  19. 今天分享一个用Python来爬取小说的小脚本!(附源码)
  20. 教你修改网卡物理地址(MAC)

热门文章

  1. 联合国儿童基金会投资六家区块链初创企业,目标是解决“全球性挑战”
  2. 简练软考知识点整理-互联网+
  3. lightgallery.js 画廊/相册插件首选!
  4. Swift - 判端网络连接状态,连接类型(3G还是Wifi)
  5. Javascript 调用百度地图不显示
  6. 三大执业考试爆泄题丑闻 部分助考机构成泄题中介
  7. 应对亚洲劳动力成本不断上升的挑战
  8. 基金学习20190802
  9. 【原创】MapReduce实战(一)
  10. 孔维滢201771010110《面向对象程序设计(java)》第一周学习总结