c语言const限制什么,[C语言]类型限定词const解析
标签:
作为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解析相关推荐
- 决定c++语言中函数的返回值类型的是,全国2009年10月高等教育自学考试C++程序设计试题及部分参考答案...
全国2009年10月高等教育自学考试 C++程序设计试题 课程代码:04737 一.单项选择题(本大题共20小题,每小题1分,共20分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码 ...
- char* 赋值 const char* 释放_嵌入式Linux开发《C语言专题(十:彻底搞懂“关键字”const)》...
C语言中的关键字总共有32个:auto break case char const continue default do double else enum extern float for goto ...
- 簇的局部变量中布尔类型_GO语言入门(go的基本类型)
本文节选自<go入门指南> 如果觉得文章太长,可以直接看末尾的总结. 常量 常量使用关键字 const 定义,用于存储不会改变的数据. 存储在常量中的数据类型只可以是布尔型.数字型(整数型 ...
- c语言 const常量作用,C语言 const常量讲解
//const的本质 //const本质上是伪常量,无法用于数组初始化以及全局变量初始化 //原因在于const仅仅限定变量无法直接赋值,但是却可以通过指针间接赋值 //例如局部常量在栈区,而不在静态 ...
- golang 排序list_Go语言使用sort包对任意类型元素的集合进行排序的方法
本文实例讲述了Go语言使用sort包对任意类型元素的集合进行排序的方法.分享给大家供大家参考.具体如下: 使用sort包的函数进行排序时,集合需要实现sort.Inteface接口,该接口中有三个方法 ...
- C语言 const 修饰指针 - C语言零基础入门教程
目录 一.const 简介 二.const 修饰指针 1.const int *p 2.int const *p 3.int * const p 4.const int * const p 三.猜你喜 ...
- C语言 const 修饰变量 - C语言零基础入门教程
目录 一.const 简介 二.const 实战 1.使用 const 修饰变量必须初始化 2.使用 const 修饰变量不初始化 3.修改 const 修饰变量的值 三.重点提示 四.猜你喜欢 零基 ...
- C程序设计语言现代方法07:基本类型
目录 1. 基本类型和构造类型 1.1 基本类型 1.2 构造类型 2. C语言两大类型(存储格式根本上不同) 3. 整数类型 3.1 6种有效组合 3.2 整数常量 3.3 整数溢出 3.4 读写整 ...
- 在c语言中出现的int错误类型,【揭秘】C语言类型转换时发生了什么?
原标题:[揭秘]C语言类型转换时发生了什么? ID:技术让梦想更伟大 作者:李肖遥 在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统,我们常用的算术类型包括两种类型:整数类型和浮 ...
最新文章
- 第19章 解释器模式(Interpreter Pattern)
- 【Android 高性能音频】Oboe 播放器开发 ( 为 OpenSL ES 配置参数以获得最佳延迟 | Oboe 音频流 | Oboe 音频设备 )
- Linux下Oracle 10.2.0.1升级到10.2.0.4总结
- 2019建中台,2020拆中台,为什么很多公司中台战略宣告“失败”?
- Modeling Our World 读书笔记
- gerber文件怎么导贴片坐标_利用Gerber文件生成贴片坐标及元件位置图的方法技巧...
- android音量键广播,音量控制键控制的音频流(setVolumeControlStream)描述
- 好看高端的立体表白相册程序
- lable里的字体颜色_?APP界面的字体规范!
- java源代码解除断点_此断点目前不会被命中,源代码与原始代码不同(即使在清理/重建后)...
- 用Excel拟合imu温度趋势线
- 74LS138译码器介绍
- turtle绘制八卦镜
- 计算机电源功率高好吗,电脑电源买多大功率适合?实战分析分享
- 轻松输入并注音生僻字
- 昆石网络 VOS3000虚拟运营支撑系统任意文件读取漏洞
- 神经网络多分类的实现总结
- python—成绩管理系统考试题目:小学五年级学生小明、小王、小丽、小花的语文、英语、数学成绩如……
- vue中将base64的pdf文件流转换成pdf并预览(二)——base64转PDF工具的使用
- Linux Watchdog/看门狗
热门文章
- c 子类对象 访问父类对象受保护成员_面向对象的三大特征
- python时间格式转换为美式日期_如何将日期时间格式的排列转换为python中的打印?...
- 配置php7开发环境,Windows7系统环境安装配置PHP开发环境
- rust原地复活_植物大战僵尸英雄锈铁螺栓新手卡组推荐 rustbolt多手牌陷阱恢复后期流卡组...
- ospf的七类lsa存在于_OSPF抑制7类LSA的转发
- linux oracle11.2安装 ins-1010,ARCHLINUX下安装oracle11g
- android配置so支持armeabi,安卓项目中so库选择(ndk abiFilters设置,armeabi,armeabi-v7a,arm64-v8a)...
- mysql三高教程(二):2.7 如何约束数据
- C++socket编程(七):7.1 http协议讲解,通过抓包和telnet分析
- 工业机器人维保调查表_《工业机器人系统集成及维护》课程建设调研报告