标签:

作为C90增加的一个受限类型关键字,const赋予了它修饰的变量一个新属性——不变性,如果一个变量声明中带有关键字const,则无法通过赋值、增减运算来修改该变量的值。

一、指针与const结合

const与指针的结合较为复杂,因为我们需要把'让指针本身成为const'和'让指针指向的值成为const'区分开来。

1.1 int const *p

该声明表明我们声明了一个指针p,const在*左边,代表整个'*p'为不可修改的,也即p指向的值不可变。

int a = 2;

int b = 10;

const int *p = &a;

printf("%x %d\n",p,*p);

*p = 4;

printf("%x %d\n",p,*p);

尝试修改指针p指向的值,编译后报错:[Error] assignment of read-only location '*p',p指向的位置为只读。

修改一下a的值,看运行结果。

没有报错,a的值背成功修改。

再试一下,修改p的值:

int a = 2;

int b = 10;

const int *p = &a;

printf("%x %d\n",p,*p);

//  *p = 4;     //[Error] assignment of read-only location '*p'

p = &b;

printf("%x %d\n",p,*p);

运行成功,由结果能看出,const的只读限制只对*p起作用,而p、p指向的对象的操作(a)都可读可写。

在看一个,将有const的指针赋值给没有const的指针:

int a = 2;

int b = 10;

const int *p = &a;

printf("%x %d\n",p,*p);

int *p1 = &a;

printf("%x %d\n",p1,*p1);

p1 = p;

被const修饰的p与没有被修饰的p1值相同,指向位置的值也相同。不过在第九行'p1 = p;',弹出警告,继续运行:[Warning] assignment discards 'const' qualifier from pointer target type

1.2 int * const p

const在*右边,代表指针p不可修改,也即p总是指向同一个地址。

先修改个地址试一试。

int a = 2;

int b = 10;

int * const p2 = &a;

printf("%x %d\n",p2,*p2);

p2 = &b;

第六行报错:[Error] assignment of read-only variable 'p2',p2为只读变量。

再折腾折腾,直接修改它指向的值,引用对象的值试试。

p2指向的地址都没变,只要不修改地址,其余的操作都可行。

1.3 const int * const p

第一个const表示p指向的值不可变,第二个const表示p本身不可变。也即p必须指向同一个位置,且所指位置存储的值也不可改变。

int a = 2;

int b = 10;

const int * const p3 = &a;

printf("%x %d\n",p3,*p3);

a = 3;

printf("%x %d\n",p3,*p3);

//[Error] assignment of read-only variable '*p3'

//  p3 = &b;

printf("%x %d\n",p3,*p3);

//[Error] assignment of read-only location '*p3'

//  *p3 = 1;

printf("%x %d\n",p3,*p3);

1.4 总结

当const与指针一同出现时,位于*左边的const使得数据成为常量,位于*const右边的const使得指针自身成为常量。更直白点来说就是:修饰谁,谁的内容就不可变,其余的都可变。

二、const与全局变量

由于程序的任何部分都可以修改全局变量的之,因此使用全局变量是一种很冒险的写法。但当我们用上了const后,这个问题就解决了。

2.1 extern

在一个工程中,如果我们在一个.c文件中声明了一个全局常量,在该工程其他文件中,对该全局常量的引用就需要使用关键字'extern'。

/* file1.c---存放有全局常量的文件*/

const int num = 100;

/* file2.c---需要引用全集常量的文件*/

extern const int num;

2.2 include与static

通过将全局声明放入头文件.h中,可以不必再纠结在哪个文件定义了声明、哪个文件引用了声明。不过需要注意的是,在声明时,const前必须加上static关键字,否则每一个引用该.h的文件都会得到该数据的一个副本,从而导致不同文件间的数据交流出问题。

/*constant.h*/

static const int num = 100;

使用头文件的缺点在于每一次引用.h都复制了数据,当.h中含有大量的数据时,就会引发新的问题了。

标签:

来源: https://www.cnblogs.com/magicxyx/p/10158856.html

c语言const限制什么,[C语言]类型限定词const解析相关推荐

  1. 决定c++语言中函数的返回值类型的是,全国2009年10月高等教育自学考试C++程序设计试题及部分参考答案...

    全国2009年10月高等教育自学考试 C++程序设计试题 课程代码:04737 一.单项选择题(本大题共20小题,每小题1分,共20分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码 ...

  2. char* 赋值 const char* 释放_嵌入式Linux开发《C语言专题(十:彻底搞懂“关键字”const)》...

    C语言中的关键字总共有32个:auto break case char const continue default do double else enum extern float for goto ...

  3. 簇的局部变量中布尔类型_GO语言入门(go的基本类型)

    本文节选自<go入门指南> 如果觉得文章太长,可以直接看末尾的总结. 常量 常量使用关键字 const 定义,用于存储不会改变的数据. 存储在常量中的数据类型只可以是布尔型.数字型(整数型 ...

  4. c语言 const常量作用,C语言 const常量讲解

    //const的本质 //const本质上是伪常量,无法用于数组初始化以及全局变量初始化 //原因在于const仅仅限定变量无法直接赋值,但是却可以通过指针间接赋值 //例如局部常量在栈区,而不在静态 ...

  5. golang 排序list_Go语言使用sort包对任意类型元素的集合进行排序的方法

    本文实例讲述了Go语言使用sort包对任意类型元素的集合进行排序的方法.分享给大家供大家参考.具体如下: 使用sort包的函数进行排序时,集合需要实现sort.Inteface接口,该接口中有三个方法 ...

  6. C语言 const 修饰指针 - C语言零基础入门教程

    目录 一.const 简介 二.const 修饰指针 1.const int *p 2.int const *p 3.int * const p 4.const int * const p 三.猜你喜 ...

  7. C语言 const 修饰变量 - C语言零基础入门教程

    目录 一.const 简介 二.const 实战 1.使用 const 修饰变量必须初始化 2.使用 const 修饰变量不初始化 3.修改 const 修饰变量的值 三.重点提示 四.猜你喜欢 零基 ...

  8. C程序设计语言现代方法07:基本类型

    目录 1. 基本类型和构造类型 1.1 基本类型 1.2 构造类型 2. C语言两大类型(存储格式根本上不同) 3. 整数类型 3.1 6种有效组合 3.2 整数常量 3.3 整数溢出 3.4 读写整 ...

  9. 在c语言中出现的int错误类型,【揭秘】C语言类型转换时发生了什么?

    原标题:[揭秘]C语言类型转换时发生了什么? ID:技术让梦想更伟大 作者:李肖遥 在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统,我们常用的算术类型包括两种类型:整数类型和浮 ...

最新文章

  1. 第19章 解释器模式(Interpreter Pattern)
  2. 【Android 高性能音频】Oboe 播放器开发 ( 为 OpenSL ES 配置参数以获得最佳延迟 | Oboe 音频流 | Oboe 音频设备 )
  3. Linux下Oracle 10.2.0.1升级到10.2.0.4总结
  4. 2019建中台,2020拆中台,为什么很多公司中台战略宣告“失败”?
  5. Modeling Our World 读书笔记
  6. gerber文件怎么导贴片坐标_利用Gerber文件生成贴片坐标及元件位置图的方法技巧...
  7. android音量键广播,音量控制键控制的音频流(setVolumeControlStream)描述
  8. 好看高端的立体表白相册程序
  9. lable里的字体颜色_?APP界面的字体规范!
  10. java源代码解除断点_此断点目前不会被命中,源代码与原始代码不同(即使在清理/重建后)...
  11. 用Excel拟合imu温度趋势线
  12. 74LS138译码器介绍
  13. turtle绘制八卦镜
  14. 计算机电源功率高好吗,电脑电源买多大功率适合?实战分析分享
  15. 轻松输入并注音生僻字
  16. 昆石网络 VOS3000虚拟运营支撑系统任意文件读取漏洞
  17. 神经网络多分类的实现总结
  18. python—成绩管理系统考试题目:小学五年级学生小明、小王、小丽、小花的语文、英语、数学成绩如……
  19. vue中将base64的pdf文件流转换成pdf并预览(二)——base64转PDF工具的使用
  20. Linux Watchdog/看门狗

热门文章

  1. c 子类对象 访问父类对象受保护成员_面向对象的三大特征
  2. python时间格式转换为美式日期_如何将日期时间格式的排列转换为python中的打印?...
  3. 配置php7开发环境,Windows7系统环境安装配置PHP开发环境
  4. rust原地复活_植物大战僵尸英雄锈铁螺栓新手卡组推荐 rustbolt多手牌陷阱恢复后期流卡组...
  5. ospf的七类lsa存在于_OSPF抑制7类LSA的转发
  6. linux oracle11.2安装 ins-1010,ARCHLINUX下安装oracle11g
  7. android配置so支持armeabi,安卓项目中so库选择(ndk abiFilters设置,armeabi,armeabi-v7a,arm64-v8a)...
  8. mysql三高教程(二):2.7 如何约束数据
  9. C++socket编程(七):7.1 http协议讲解,通过抓包和telnet分析
  10. 工业机器人维保调查表_《工业机器人系统集成及维护》课程建设调研报告