【C深度解剖】const关键字

news2024/10/5 23:28:19

简介:本系列博客为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.coloradmin.cn/o/1418559.html

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

相关文章

4核16G10M幻兽帕鲁服务器只需26元/月?!阿里云挑战全网最低价

1月29日,阿里云又发大招!将原先4核16G3M的套餐直接升级至10M,价格从32元直降至26元! 目前已是全网幻兽帕鲁4-8人游玩配置的服务器性价比极高的套餐! 》》阿里云4核16G10M 26元/月 整理至1月29日,各家幻兽…

Ubuntu本地部署Nextcloud并结合内网穿透实现远程访问搭建个人云盘

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” 文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访…

Mac+Android Studio配置 Flutter环境

Fluttrer中文下载官网 Flutter下载官网 1、环境变量 .zshrc #Flutter export PUB_HOSTED_URL"https://pub.flutter-io.cn" export FLUTTER_STORAGE_BASE_URL"https://storage.flutter-io.cn" export FLUTTER_HOME/Users/leon/Flutter/flutter_3_10_4/f…

强化学习-google football 实验记录

google football 实验记录 1. gru模型和dense模型对比实验 实验场景:5v5(控制蓝方一名激活球员),跳4帧,即每个动作执行4次 实验点: 修复dense奖励后智能体训练效果能否符合预期 实验目的: 对比gru 长度为16 和 dens…

【前端web入门第二天】02 表单-input标签-单选框-多选框

表单 文章目录: 1.input标签基本使用 1.1 input标签占位文本1.2 单选框 radio 1.3 多选框 checkbox 作用:收集用户信息。 使用场景: 登录页面注册页面搜索区域 1.input标签基本使用 input标签type属性值不同&#xff0c;则功能不同。 <input type"..."&g…

如何搭建开源笔记Joplin服务并实现远程访问本地数据

文章目录 1. 安装Docker2. 自建Joplin服务器3. 搭建Joplin Sever4. 安装cpolar内网穿透5. 创建远程连接的固定公网地址 Joplin 是一个开源的笔记工具&#xff0c;拥有 Windows/macOS/Linux/iOS/Android/Terminal 版本的客户端。多端同步功能是笔记工具最重要的功能&#xff0c;…

【深度学习:目标检测】深度学习中目标检测模型、用例和示例

【深度学习&#xff1a;目标检测】深度学习中目标检测模型、用例和示例 什么是物体检测&#xff1f;物体检测与图像分类物体检测与图像分割 计算机视觉中的目标检测物体检测的优点物体检测的缺点深度学习和目标检测人员检测 物体检测如何工作&#xff1f;一阶段与两阶段深度学习…

从0开始搭建若依微服务项目 RuoYi-Cloud(保姆式教程 一)

掌握陌生项目解读技巧 掌握若依(RuoYi-Cloud)框架 掌握SpringCloud Alibaba体系项目开发套路&#xff0c;结合我之前所有企业项目来学习就知道有多么简单。 一、框架介绍 1. 简介 一直想做一款后台管理系统&#xff0c;看了很多优秀的开源项目但是发现没有合适的。于是利用空…

老司机用脚本批量巧删恶意文件

作者&#xff1a;田逸&#xff08;formyz&#xff09; 一个NFS服务器&#xff0c;为多个Web项目所共享。这些目录包括PHP程序、图片、HTML页面和用户上传的文档和附件等。因为某些Web框架古老&#xff0c;存在诸如不对上传文件做严格的安全性检查&#xff0c;虽然此NFS服务器位…

OceanMind海睿思入选《2023大数据产业年度创新技术突破奖》,并蝉联多项图谱

近日&#xff0c;由数据猿和上海大数据联盟主办&#xff0c;上海市经济和信息化委员会、上海市科学技术委员会指导的“第六届金猿季&魔方论坛——大数据产业发展论坛”在上海成功举行&#xff0c;吸引了数百位业界精英的参与。中新赛克海睿思作为国内数字化转型优秀厂商代表…

虚拟机安装Centos8.5

记得看目录哦&#xff01; 附件1. 新建虚拟机2. 安装Centos8.5 附件 安装包自行下载 https://mirrors.aliyun.com/centos/8/isos/x86_64/ 1. 新建虚拟机 2. 安装Centos8.5 启动虚拟机–选择第一个install Centos8.5 记得接收许可证

25考研北大软微该怎么做?

25考研想准备北大软微&#xff0c;那肯定要认真准备了 考软微需要多少实力 现在的软微已经不是以前的软微了&#xff0c;基本上所有考计算机的同学都知道&#xff0c;已经没有什么信息优势了&#xff0c;只有实打实的有实力的选手才建议报考。 因为软微的专业课也是11408&am…

在Windows上安装与配置Apache服务并结合内网穿透工具实现公网远程访问本地内网服务

文章目录 前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpolar web ui管理界面3.2 创建公网地址 4. 固定公网地址 前言 Apache作为全球使用较高的Web服务器…

Web开发8:前后端分离开发

在现代的 Web 开发中&#xff0c;前后端分离开发已经成为了一种常见的架构模式。它的优势在于前端和后端可以独立开发&#xff0c;互不干扰&#xff0c;同时也提供了更好的可扩展性和灵活性。本篇博客将介绍前后端分离开发的概念、优势以及如何实现。 什么是前后端分离开发&am…

Linux-动静态库

背景 在实践中&#xff0c;我们一定会使用别人的库&#xff08;不限于C、C的库&#xff09;&#xff0c;在实践中&#xff0c;我们会使用成熟、被广泛使用的第三方库&#xff0c;而不会花费很多时间自己造轮子&#xff0c;为了能更好地使用库&#xff0c;就要在学习阶段了解其…

[嵌入式系统-4]:龙芯1B 开发学习套件-1-开发版硬件介绍

目录 前言&#xff1a; 一、龙芯 1B 开发学习套件简介 1.1 概述 二、龙芯1B 200开发板硬件组成与接口介绍 2.1 概述 2.2 核心板 2.2.1 CPU 2.2.2 什么是核心板 2.2.3 龙芯1B 200核心板 2.2.4 龙芯1B核心板的接口定义 2.3 开发板 2.3.1 龙芯1B0200开发板 2.3.2 龙芯…

Linux使用匿名管道实现进程池得以高效通信

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;Nonsense—Sabrina Carpenter 0:50━━━━━━️&#x1f49f;──────── 2:43 &#x1f504; ◀️ ⏸ ▶️ …

Redis 持久化详解:RDB 与 AOF 的配置、触发机制和实际测试

什么是持久化&#xff1f; 就是 Redis 将内存数据持久化到硬盘&#xff0c;避免从数据库恢复数据。之所以避免从数据库恢复数据是因为后端数据通常有性能瓶颈&#xff0c;大量数据从数据库恢复可能会给数据库造成巨大压力。 Redis 持久化通常有 RDB 和 AOF 两种方式&#xff…

​ PaddleHub 首页图像 - 文字识别chinese_ocr_db_crnn_server​

PaddleHub 便捷地获取PaddlePaddle生态下的预训练模型&#xff0c;完成模型的管理和一键预测。配合使用Fine-tune API&#xff0c;可以基于大规模预训练模型快速完成迁移学习&#xff0c;让预训练模型能更好地服务于用户特定场景的应用 零基础快速开始WindowsLinuxMac Paddle…

算法学习系列(三十):高斯消元解线性方程组

目录 引言一、高斯消元法二、代码模板三、例题 引言 这个高斯消元法主要是线性代数的一些东西&#xff0c;然后步骤跟上课讲的步骤是一样的&#xff0c;只不过使用代码实现了而已&#xff0c;在竞赛和笔试中还是有出现的可能的&#xff0c;所以掌握它还是很重要的&#xff0c;…