有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定。例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小。为了满足这一要求,可以使用const关键字对变量加以限定:

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

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

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

运行结果:
100, 90, 80

const 和指针

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

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

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

const 和函数形参

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

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

我们自己在定义函数时也可以使用 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语言const的用法详解,C语言常量定义详解相关推荐

  1. 第十章 结构体_C语言typedef的用法详解

    C语言允许为一个数据类型起一个新的别名,就像给人起"绰号"一样. 起别名的目的不是为了提高程序运行效率,而是为了编码方便.例如有一个结构体的名字是 stu,要想定义一个结构体变量就 ...

  2. 第十章 结构体_C语言共用体(C语言union用法)详解

    通过前面的讲解,我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员.在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为:  un ...

  3. 第十章 结构体_C语言随机数生成教程,C语言rand和srand用法详解

    在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌. 在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随 ...

  4. c++ new一个结构体_C语言结构体,又一个纸老虎,纯干货讲解(附代码)

    来源:网络,排版整理:晓宇 微信公众号:芯片之家(ID:chiphome-dy)结构体的定义结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构.结构体和其他类型基础数 ...

  5. c语言 结构体_C语言 技能提升 系列文章 (三)结构体

    今天,来跟大家聊一聊C语言中的结构体. 在C语言的各种数据类型中,结构体最特别,因为它是可以被程序员定义的,它的特点是非常的灵活. 定义 struct defined_name{ type_name ...

  6. c语言 结构体 占位符,深入理解结构体中占位符的用法

    深入理解结构体中占位符的用法 复制代码 代码如下: typedef union { struct x{ char a1 : 2; char b1 : 3; char c1 : 3; }x1; char ...

  7. C语言 结构体Struct 中冒号的用法

    C语言 结构体Struct 中冒号的用法 本文有部分内容参考菜鸟教程-C 位域 . 关于"位域"的说明 有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位. ...

  8. cjson 对象是json数组型结构体_C语言cJSON库的使用,解析json数据格式

    对于c语言来说是没有字典这样的结构的,所以对于解析json格式的数据来说不是那么好解析,但是有些时候又会需要处理这样的数据格式,这里就有一个解析json的函数库可以给我们使用了.这个函数库就是cJSO ...

  9. c语言json结构体_C语言解析JSON源码

    2020-01-09 关键字:cJSON.linux JSON解析 JSON 是一种在互联网领域内很常用的轻量级数据交换协议. 它与 XML 的地位差不多,但就笔者而言,笔者更喜欢 JSON 的风格, ...

最新文章

  1. R语言可视化绘图基础知识详解
  2. Windows phone 应用开发[12]-Pex 构建自动化白盒测试[下]
  3. mysql 远程_MYSQL开启远程访问权限的方法
  4. java 线程池 源码_java线程池源码分析
  5. python秒表游戏_数学游戏Tkinter中的Python计时器
  6. 不使用第三个变量的情况下,实现两个变量间的互换。
  7. 51单片机汇编语言流水灯代码
  8. 云计算机教室详细建设方案,计算机教室更新建设方案.doc
  9. idea设置字体不生效的问题
  10. 两个月可以学完java吗?java要学多久?
  11. BCELOSS和MSELOSS区别(pytorch BCELoss and MSELoss)
  12. 时间戳转换成字符串,返回Invalid Date(自己遇到的坑)
  13. 毕业设计分享----基于Java的个性化博客空间的设计与实现
  14. CSS奇思妙想 -- 使用 background 创造各种美妙的背景(上篇)...
  15. Linux下随机生成密码的命令总结
  16. 解决Axure的元件库中部分原件不可使用的方法
  17. libwebsocket 编译mini demo时遇到require lws_config
  18. 【永久开源】Pear Admin Layui 基于 Layui 的后台管理模板
  19. 理解:什么是缓存,什么是文件缓存?
  20. 求一款简单高效的快递查询软件

热门文章

  1. JAVA三大平台介绍
  2. 七桥问题python_Python系列—一笔画问题的算法研究
  3. 创建VBOX OSX系统
  4. 深大算法实验四——流水线问题
  5. vue.runtime.esm.js?2b0e:619 [Vue warn]: Missing required prop: to
  6. ES 文档的基本操作
  7. 鸿蒙os骁龙845,商标已就绪!鸿蒙OS正式版即将推送
  8. python keyboard hook_Keyboard Hook API函数 参数说明
  9. Twitter Snowflake 主键生成
  10. php颜色变成与之相反的颜色编码