【C语言】const关键字的作用

news2024/12/28 4:49:56

文章目录

  • 一. const修饰变量
  • 二. const修饰指针
  • 三. const修饰函数参数

一. const修饰变量

被 const 修饰的变量具有常属性,这里的常属性指的是变量的值不能被修改

int main()
{
	// const可以写在类型之前,也可以写在类型之后
	int const a = 10;
	a = 20;// error 报错
	return 0;
}

编译报错:
在这里插入图片描述

其实 const 修饰的变量的值并非真的不可修改,在 C/C++ 中我们可以通过拿到这个变量的地址去间接修改它的值:
在这里插入图片描述

PS:在 C/C++ 中被 const 修饰的变量已经是一个常量了,这时它具有替换的作用,编译器在编译代码的时候,在程序中看到对常量中的内容读取时,会直接使用常量中的内容替换常量。

对此我们使用 volatile 关键字修饰这个常量,告诉编译器不要对这个常量进行优化,看看结果如何:
在这里插入图片描述

那么const修饰的变量,意义何在?其实这个 const 只是起一个告知作用:

  • 告知编译器,让编译器对这个变量进行直接修改的检查。
  • 告知程序员,不要对这个变量进行修改,这也属于一种“自描述"。

二. const修饰指针

  • const 写在 * 之前:修饰指针解引用之后的值,即 *p
  • const 写在 * 之后:修饰指针变量本身,即这个指针变量只能指向初始化时给的地址,不能再修改指向其它地址
int main()
{
	int a = 10;
	const int *p = &a;       // p指向的变量的值不能修改
	int const *p = &a;       // p指向的变量的值不能修改

	int * const p = &a;      // p指向的地址不可修改

	const int * const p = &a;// p指向的地址和这个地址的数据都不能修改

	return 0;
}

关于指针变量的赋值问题

指针变量在相互赋值(传递地址)时,权限只能缩小,不能放大

int main()
{
	// 1、报错,p1这个指针变量的权限是只能读取数据,不可修改数据
	//    不能把它的地址交给另外一个可读可写的指针变量(不能放大权限)
	int a = 10;
	const int* p1 = &a;
	int* p2 = p1;

	// 2、可以通过编译,p1的权限是可读可写
	//    可以把它的地址交给一个只读不可写的指针变量p2(可以权限缩小)
	int a = 10;
	int* p1 = &a;
	const int* p2 = p1;

	// 3、可以通过编译,和权限无关
	//    const修饰的是p1这个指针变量本身
	//    把p1赋值给p2只是把自己指向的地址拷贝给p2
	int a = 10;
	int* const p1 = &a;
	int* p2 = p1;
	return 0;
}

三. const修饰函数参数

在设计函数形参时,不论是传值还是传址,如果函数内部不修改形参的值的话,最好给形参加上 const

在这里插入图片描述

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

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

相关文章

【操作系统——内存的基本知识,逻辑地址到物理地址的转换,操作系统对内存空间的分配和回收以及扩充和保护】

文章目录 内存的基本知识什么是内存?内存有什么作用?进程运行的基本原理知识回顾 内存的管理概念内存空间的扩充内存空间的分配与回收连续分配管理方式动态分区的算法: 内存的基本知识 什么是内存?内存有什么作用? 内…

Linux日志分析

日志的分类 内核以及系统日志 内核及系统日志由系统服务 rsyslog 统一管理,主配置文件为/etc/rsyslog.conf,主程序/sbin/rsyslogd Linux 操作系统本身和大部分服务器程序的日志文件都默认放在目录/var/log/下。 系统日志基于rsyslog服务&#xf…

【LeetCode】剑指 Offer 63. 股票的最大利润 p304 -- Java Version

题目链接:https://leetcode.cn/problems/gu-piao-de-zui-da-li-run-lcof/ 1. 题目介绍(63. 股票的最大利润) 假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少? 【测试用…

自然语言处理 —— 02 基于规则的词法分析

一、什么是词法分析? 词:是自然语言中能够独立运用的最小单位,是语言信息处理的基本单位。 词法分析:是词汇层的分析技术。主要包括词的识别、形态分析、词性标注等任务。 1. 词的识别 将句子转换成词序列【就是分词?】 2. 形态分析 词的构成、形态变化、词形还原。 …

物联网定位技术|实验报告|实验三 PDM定位算法

目录 1. 实验目标 2. 实验要求 3. 算法介绍 3.1 PDM算法 4. 算法实现 第一步:将数据读入内存 第二步:判断锚节的个数 第三步:将所有的两点间的距离关系读入距离矩阵 第四步:利用最短路径算法 第五步:构造节点跳数矩…

JVM-0419~20

类的加载 类的加载过程(生命周期) 类的加载分几步? 按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段: 基本数据类型在虚拟机里面都预…

【智能座舱系列】-华为发布全球首款车载光场屏 开拓车载视觉体验新航道

4月16日,2023华为智能汽车解决方案“内赋智能,焕发新生”新品发布会在上海举行,华为正式发布全新车载娱乐屏品类:HUAWEI xScene 光场屏。该产品采用独创的光学引擎技术,具有大画幅、景深感、低晕动、眼放松等特点,大幅提升车内视觉体验。 华为光场屏:私人影院装入车内,…

非常详细的阻抗测试基础知识

编者注:为什么要测量阻抗呢?阻抗能代表什么?阻抗测量的注意事项... ...很多人可能会带着一系列的问题来阅读本文。不管是数字电路工程师还是射频工程师,都在关注各类器件的阻抗,本文非常值得一读。全文13000多字&#…

2. 算法分析

2. 算法分析 研究算法的最终目的就是如何花更少的时间,如何占用更少的内存去完成相同的需求。 我们要计算算法时间耗费情况,首先我们得度量算法的执行时间,那么如何度量呢? 2.1 算法的时间复杂度分析 事后分析估算方法&#x…

关于web安全测试在功能测试中的应用

关于web安全测试在功能测试中的应用 一、安全基本概念1.1实施安全评估1.1.1资产等级划分1.1.2威胁分析1.1.3风险分析1.1.4 安全方案 1.2 安全原则 二、我的安全测试模型三、安全测试在功能测试中的应用3.1 更改url3.2 逻辑缺陷:3.3 破坏流程顺序3.4 接口提示信息3.5…

HNU-计算机系统-讨论课5

WARNING: 本题为开放性题目,所设计的也仅仅是一个可能的模型而已,再考虑到个人水平有限。在呈现效果上难免会有缺漏以及可行性的缺陷。故请批判性地接收! 所以如果知识有错误或者缺漏,请一定要指出,您的建…

计算机类大学生竞赛经验分享

如果你是作为一个科班出生的学习编程方向的一名在校大学生,那么如果对竞赛感兴趣,可以看看这篇文章 本人作为一名前端开发方向的学生,将自己这几年的参赛经验和比赛相关类型介绍分享给大家 首先我们要知道,竞赛分为三种大概的方向…

《类和对象》(上篇)

本文主要对类和对象有一个初步的了解。 文章目录 前言1、类的引入和定义2、类的访问限定符及封装2.1 访问限定符2.2 封装 3 、类的作用域4 、类的实例化5 、类对象的模型5.1 类对象的大小5.2 类对象存储方式 6、this 指针6.1 引子6.2 特性6.3 this指针的一个问题 前言 C语言是面…

MySQL插入和查询blob字段类型的sql语句

创建表: CREATE TABLE t_inpatient_medical_records ( id bigint(20) NOT NULL AUTO_INCREMENT, inpatient_record_code varchar(32) DEFAULT NULL COMMENT 就诊流水号, patient_name varchar(256) DEFAULT NULL COMMENT 患者姓名, pat_id varchar(16) DEFAULT NULL…

java数据类型的转换以及精度丢失

java数据类型的转换以及精度丢失_long转double会丢失精度吗_ღLiJia的博客-CSDN博客 一.浮点类型在计算机当中的存储 float存储需求是4字节(32位), 其中1位最高位是符号位,中间8位表示阶位,后32位表示值 float的范围: -2^128 ~ …

搞懂哈希散列

文章目录 1. 哈希概念2. 如何解决哈希冲突?3. 哈希函数概念4. 闭散列(目前淘汰的方法,了解)**4.1.线性探测****4.2. 二次探测**4.3 闭散列查找与删除 5. 开散列6. 开散列与闭散列比较 1. 哈希概念 搜索树需要多次的关键码比较来搜索到结果&a…

AutoGPT、AgentGPT、BabyAGI、HuggingGPT、CAMEL:各种基于GPT-4自治系统总结

ChatGPT和LLM技术的出现使得这些最先进的语言模型席卷了世界,不仅是AI的开发人员,爱好者和一些组织也在研究探索集成和构建这些模型的创新方法。各种平台如雨后春笋般涌现,集成并促进新应用程序的开发。 AutoGPT的火爆让我们看到越来越多的自…

Linux 3.14的设备树-实战开发代码

OF提供的函数主要集中在drivers/of/目录下,有address.c,base.c,device.c,fdt.c,irq.c,platform.c等等 1,根据deice_node结构的full_name参数,在全局链表of_allnodes中,查找合适的device_node struct device_node *of_find_node_by…

概率/期望dp

思维方式 概率/期望dp都是分析从当前状态能否去到其他情况,然后进行期望/概率公式的运算,最后消元推导出一般式。 ​​​​​​Problem - 4089 (hdu.edu.cn) 思路:概率dp,正推 分类讨论,设dp[i][j]表示i人的队伍在…

力扣sql中等篇练习(八)

力扣sql中等篇练习(八) 1 确认率 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 # 分别统计没确认的用户和已经确认了的用户 SELECT s.user_id,ROUND(SUM(IF(c.actionconfirmed,1,0))/count(*),2) co…