【C深度解剖】const关键字

简介:本系列博客为C深度解剖系列内容,以某个点为中心进行相关详细拓展
适宜人群:已大体了解C语法同学
作者留言:本博客相关内容如需转载请注明出处,本人学疏才浅,难免存在些许错误,望留言指正
作者博客链接:睡觉待开机

下面是本节博客的大纲梳理:
在这里插入图片描述

引言

本节博客是围绕const为主题进行详细说明的,不知道大家是否知道,在公司招聘中,C语言知识关键字部分经常被问到的关键字就是const,也就是说const常用且细节比较多,下面且听我一一道来。

在这里插入图片描述


1.const概念

注:这里只是告诉大家const大概的这个属性是这样的,具体会在2.const常见用法中进行详谈。

简介:const首先是一个C中的常用关键字,用来在编译器层面(语法层面)约束修饰对象防止被修改,是一种假常量式防修改,约束性较弱。(这里所说的假常量和弱约束性大家可能不理解,继续往下看会有解释。)

下面对我所说的约束性强弱问题进行解释:在我们计算机当中,其实约束性这个概念并不陌生,比如我们对一个常量字符串进行修改的话,计算机是不允许的,就算编译器没有报错允许编译,那么我们操作系统也不会允许被修改,因为常量字符串存储在我们内存中的常量数据区,这块内存是不可被修改的,这也相对来说属于一种强的约束性。而上面我所说的const关键字具有弱约束性的意思就是,虽然const+变量表示不可以修改,但是也只是处在编译器角度来说的,只是告诉编译器帮我检查一下我往后的代码哈,不能修改该变量哈,如果我修改了告诉我一下哈。大概是这个样子。虽然编译器帮你检查是否修改并且可以为你提供一些警告甚至报错,但是我们仍然可以通过其他方式对该变量的值进行修改,比如指针的方式。
同理,我上面所说的假常量也跟弱约束性一样的意思,不允许就该的数据我们称为常量,但是const+变量表面看起来不可以被修改,实际上,完全可以通过其他方式进行修改。

书写位置:在理论上而言,const书写在类型前后均可,因为const是对变量起作用,也是语法规定。


2.const的常见用法

2.1 const修饰变量

常见用法:const+变量,修改变量内容,报错。
在这里插入图片描述
但前面也说了,const关键字对修饰对象是一种弱修饰,那么const+变量,该变量按照我上面的意思也是可以进行修改的:const+变量,该变量不可被直接修改,但是可以被间接修改。
在这里插入图片描述
这样的话,const修饰的变量可以被间接修改,那有同学可能会疑惑,如果这样做,const的意义何在呢?
1.让编译器进行直接修改式检查:让编译器意识到要提示你一下。
2.提示程序员该变量不可被修改:属于一种程序员自己看的标识符。
在这里插入图片描述

const修饰的变量并不是真正的常量值。
我们知道,数组的【】内需要一个固定的数字,但是const修饰的变量放进去仍会报错(vs)。
在这里插入图片描述

2.2 const修饰数组

const修饰数组的话基本跟修饰变量是一样的,会把数组变成只读数组
在这里插入图片描述
这里其实是可以修改的,算是一种提示吧。
在这里插入图片描述

2.3 const修饰指针

const放在指针变量的✳号前,表示该指针变量不可以解引用,如果放在✳号后,表示该指针变量的内容不可以改变。

也就是说,const对于指针而言,✳号是分界线

如果const修饰指针都在*号前进行修饰,编译器会提示:
在这里插入图片描述

const修饰指针有四种形式(注:我这里以下面代码为例)

int main()
{int a = 10;int b = 20;//const int const * p = &a;//int const * p = &a;//int * const p = &a;//const int * const p = &a;//*p = 30;//p = &b;return 0;
}

分别如下:
1.const int* p = &a;这里表示p不可以解引用
在这里插入图片描述
2.int const * p = &a;这里与1同理,不再细说。
在这里插入图片描述

3.int * const p = &a;这里表示p指针变量的内容不可以改变。
在这里插入图片描述

4.const int* const p = &a;这里表示指针变量p既不可以解引用,p也不可以更改指向的空间。
在这里插入图片描述

相关概念拓展:

拓展1:指针与指针变量的概念区分:

指针:指针就是地址,地址就是内存编号。
指针变量:指针变量属于一种指针类型的变量,跟整型变量浮点型变量同一个级别。

指针(地址)的意义:指针的意义在于提升搜寻效率。
有同学可能比较好奇地址有啥意义啊,这里简单解释一下,在C语言中,C制造者为了学术化一点,把内存地址说为指针,这样更加学术化一点吧。指针(地址)的意义呢,大概就是你网购填你家地址的那个情况差不多,如果说世界上没有什么国、什么省…这些地名的话,你在哪里都会说不清楚,而且如果有人要找你,比如快递员要给你送快递,你怎么告诉他你在哪里?当然,这里有个比较笨的方法,就是快递员走遍全世界肯定能够找到你,但是成本代价太大了,计算机的内存地址意义就是如此。指针的意义在于提升搜寻效率。

然后指针变量跟指针他就不是一个概念,很多人或者书上都将两者混为一谈,让你在开始学习指针的时候就开始懵比。所谓指针变量,是专门用来存储内存地址的变量。

每一个字节都有属于自己的指针,那么多指针(地址)需要进行存储吗?不需要哈。计算机硬件约定俗成。

拓展2:左值与右值的概念
我估计这俩词很多敲代码的人并不陌生,反正是经常见(比如下图),但是具体啥意思并不清楚,这里来给大家解释一下。
在这里插入图片描述
左值:指的是变量空间的意思
右值:指的是数据的意思

比如拿下面这个代码举例:
在这里插入图片描述
那你可能大概理解了,不过这里再深入说一下,左值并不是指一个变量,右值并不等同于一个数值。左值更侧重于内存空间的概念,上面代码中int a是开辟空间的意思,而右值更侧重数值的概念,上面代码中10就是一个数值。

同一个标识符在不同的场景下不一定为左值/右值,比如下面的a在上面属于左值,在下面又属于右值了:
在这里插入图片描述
情况1:把const修饰的指针变量的内容赋给没有const修饰的指针变量,会有警告。
在这里插入图片描述
情况2:把没有const修饰的指针变量的值赋给有const修饰的指针变量的值没有警告。
在这里插入图片描述
上面的原因有点离谱,一般来说只要等号的左右两边的类型不同,编译器就会警告我们,但是这个const修饰的指针情况…怎么有一个没有警告呢?

const限制赋给不限制时,会有警告;const不限制赋给限制,没有警告。

这里解释一下,首先我们需要明白,编译器警告是出于安全考量,也就是说,如果你的代码变得更加“安全”的话,就不会警告了。const限制相对于const不限制一个变量而言,你把不限制变成限制更安全,因而情况1没有警告,而你把限制变成不限制,也就是有些权限被放开了,也就变得不太“安全”了起来,自然编译器会进行警告。

2.4修饰函数的参数

首先大家得了解形参跟实参的关系,形参是实参的一份临时拷贝。

然后,既然是临时拷贝,对于指针情况来说,如果指针被修改了就不好了,所以说const的意义就是防止在调用其他函数时候把原本的值给搞坏了。

比如下面的代码示例:

void test(const int* a)
{printf("%d\n", *a);
}int main()
{int a = 100;test(&a);return 0;
}

在这里插入图片描述

2.5 const修饰函数的返回类型

在这里插入图片描述
也是用来提示程序员,不可以修改该返回值哦,为了代码规范性,应该这样写:
在这里插入图片描述
不过对于内置类型而言(int,float…),返回类型是否加const并没有什么意义。
在这里插入图片描述


3.const意义

==const的意义在于帮助程序员检查错误。==上面概念部分关于const意义说的更详细一些,可以好好看看上面const概念部分。


说了这么多,其实大概大家就可以了解C中的const了,不过吧…c++里面好像还有补充,那又是另一个话题了。
在这里插入图片描述


完。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/656248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

菜单栏应用管理 -- Bartender 4

Bartender 4是一款旨在优化和简化Mac菜单栏管理的强大工具。它具有以下特色功能: 组织和管理菜单栏图标:Bartender 4允许用户轻松组织和管理菜单栏中的图标,可以隐藏不常用的图标,保持菜单栏的整洁和简洁。同时,用户还…

雾锁王国多人联机专用服务器推荐!最高支持16人联机

Steam平台24日新上线一款奇幻生存冒险建造动作RPG游戏《ENSHROUDED雾锁王国》,玩家将置身于一个广阔的可编辑改造的体素世界中,在被灾祸笼罩的先祖之地上展开生存之旅。在《雾锁王国》中,玩家可以独自冒险,也可以与最多16名玩家联…

Ajax入门与使用

目录 ◆ AJAX 概念和 axios 使用 什么是 AJAX? 怎么发送 AJAX 请求? 如何使用axios axios 函数的基本结构 axios 函数的使用场景 1 没有参数的情况 2 使用params参数传参的情况 3 使用data参数来处理请求体的数据 4 上传图片等二进制的情况…

漫画图解 Go 并发编程之:Channel

当谈到并发时,许多编程语言都采用共享内存/状态模型。然而,Go 通过实现 Communicating Sequential Processes(CSP)而与众不同。在 CSP 中,程序由不共享状态的并行处理器组成;相反,他们使用 Chan…

基于Redis实现短信登录

首先我们要思考一下利用redis来存储数据,那么到底使用哪种结构呢?由于存入的数据比较简单,我们可以考虑使用String,或者是使用哈希,如下图,如果使用String,同学们注意他的value,用多…

第4章 数据表示与特征工程

目录 1. 分类变量1.1 One-Hot编码(虚拟变量)检查字符串编码的分类数据 1.2 数字可以编码分类变量 2. 分箱、离散化、线性模型与树3. 交互特征与多相似特征4. 单变量非线性变换总结(2~4)5. 自动化特征选择5.1 单变量统计5.2 基于模…

C语言菜鸟入门·判断语句(if语句、if...else语句、嵌套if语句)详细介绍

目录 1. if语句 2. if...else语句 3. if...else if...else 语句 4. 嵌套if语句 C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false。 语句描述if语句一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。if...else语句一个 if 语句 后可跟…

Unity3d实现简单的战斗

使用u3d实现一个简单的战斗demo,记下学到的知识点,以备后查。 1.判断是否点中指定物体 if (Input.GetMouseButton(0)) {Ray ray Camera.main.ScreenPointToRay(Input.mousePosition);if (Physics.Raycast(ray, out RaycastHit hit)){//坐标转换Vector…

Flink问题解决及性能调优-【Flink rocksDB读写state大对象导致背压问题调优】

RocksDB是Flink中用于持久化状态的默认后端,它提供了高性能和可靠的状态存储。然而,当处理大型状态并频繁读写时,可能会导致背压问题,因为RocksDB需要从磁盘读取和写入数据,而这可能成为瓶颈。 遇到的问题 Flink开发…

世微AP5125 LED外置MOS降压恒流驱动IC 12-36V 9V 1A驱动方案

本品特点:宽输入电压范围:9V~100V ◆ 固定工作频率:140KHZ◆ 可设定电流范围:10mA~6000mA ◆ 内置抖频电路,降低对其他设备的 EMI 干扰◆ 平均电流模式采样,恒流精度更高◆ CS 电压…

136832-63-8,活细胞示踪剂CMFDA(绿色),5-氯甲基荧光素二醋酸酯,广泛应用于细胞追踪和标记实验中

136832-63-8,活细胞示踪剂CMFDA(绿色),5-氯甲基荧光素二醋酸酯,CellTracker Green CMFDA,可以用于基因表达分析等实验中,广泛应用于细胞追踪和标记实验中 您好,欢迎来到新研之家 文章关键词:1…

c语言学习笔记之字符串库函数和逗号表达式

逗号表达式 #include <stdio.h>int main(){int a 10;int b 5;int c 6;int d (a 23,b a-4,c b2);printf("%d",d); }打印结果为: 逗号表达式,从左往右依次进行,将最后一个表达式的值赋值给变量. c语言字符串相关库函数 求字符串长度strlen长度不受限制的…

Qt开源版 vs 商业版 详细比较!!!!

简单整理Qt开源版与商业版有哪些差别&#xff0c;仅供参考。 简单对比 开源版商业版许可证大部分采用对商业使用不友好的LGPLv3具备商业许可证保护代码专有许可证相关大部分模块使用LGPLv3和部分模块使用GPL组成仅第三方开源组件使用Qt的其他许可证Qt模块功能支持支持技术支持…

海外云手机为什么吸引用户?

近年来&#xff0c;随着全球化的飞速发展&#xff0c;海外云手机逐渐成为各行各业关注的焦点。那么&#xff0c;究竟是什么让海外云手机如此吸引用户呢&#xff1f;本文将深入探讨海外云手机的三大吸引力&#xff0c;揭示海外云手机的优势所在。 1. 高效的社交媒体运营 海外云…

c#窗体捕捉方向键

方法1 实现方法参考代码&#xff1a; private void Form1_Load(object sender, EventArgs e){this.KeyPreview true;}protected override bool ProcessDialogKey(Keys keyData){if (keyData Keys.Left || keyData Keys.Right || keyData Keys.Up || keyData Keys.Down){s…

工程经验分享 Incremental FastPitch

分享 NVIDIA 基于 GPU 的 TTS 解决方案介绍。 1. 基于 FastPitchHifi-GAN 的 Streaming TTS 效果优化 NVIDIA 在 TTS 领域也做了一些供大家参考的工作&#xff0c;例如提供了高效的流式 TTS 部署方案&#xff0c;利用 TensorRT 加速模型推理速度&#xff0c;并通过 Triton Inf…

【软考- 系统集成项目管理工程师2】

第一章-信息化知识-信息与信息化 今日座右铭&#xff1a;最好的偷懒方式&#xff0c;就是一次做好。 文章目录 第一章-信息化知识-信息与信息化前言一、信息1、信息的基本概念2、信息的传输模型3、信息的质量属性 二、信息系统1、系统的基本概念2、信息系统的生命周期 三、信息…

IDEA 安装阿里Java编码规范插件

1.File>Settings 2.安装之后重启 开发过程中如果有不符合规范的地方&#xff0c;会自动出现提示

【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​​ 目录 归并排序 代码实现&#xf…

pin to pin替代TI DRV8872的GLOBALCHIP直流电机驱动芯片GC8872,低成本、宽电压,内置电荷泵,短地短电源保护,限流

在现如今电机驱动芯片处于持续涨价的状态下&#xff0c;并且供货期货期长&#xff0c;偶尔缺货的状态下。为了降低设计成本&#xff0c;第一时间设计出优秀的产品占据市场高位。我这边推荐使用浙江GLOBALCHIP国产电机驱动芯片进行替换设计。供货稳定、价格低廉。GC8872是GLOBAL…