当前位置: 首页 > article >正文

单片机/C语言八股:(十四)const 关键字的作用(和 define 比呢?)

上一篇下一篇C 语言实现矩阵乘法目 录const 关键字的作用和 define 比呢1const 修饰变量① 局部变量函数内部② 全局变量文件作用域2const 与指针的组合重点难点3const 修饰函数① 修饰函数参数② 修饰函数返回值4const 修饰数组和结构体① 常量数组查找表、配置表② 结构体成员为 const较少用但合法5const 与 #define 的区别6总结const 关键字的作用和 define 比呢constant[adj] 固定的、不变的[n] 常数、常量被 const 定义后本质上还是变量只是无法修改。在必须应用常量的情况下是无法使用的所以叫做常变量。总结在最后面在 C 语言中const是一个类型限定符type qualifier用于声明某个对象为只读read-only。这意味着该对象的值在初始化后不能被程序直接修改。如果尝试修改编译器会报错除非通过强制类型转换绕过但这是未定义行为应避免。1const 修饰变量① 局部变量函数内部voidfunc(void){constintMAX_RETRY5;// MAX_RETRY 10; // 编译错误不能修改 const 变量}用 const 修饰的局部变量依旧存储在栈上但内容不可写具有明确类型比如int。② 全局变量文件作用域// file.cconstdoublePI3.1415926;默认仅在本 .c 文件可用相当于隐含static若需在多个文件共享需配合extern声明。在 .c 文件中定义在对应的 .h 文件中依旧要使用extern// constants.hexternconstdoublePI;// constants.cconstdoublePI3.1415926;// main.c#includeconstants.hdoublerPI*2;2const 与指针的组合重点难点const与指针结合时位置决定含义。记住口诀const在*左边内容不能改但指针可以改const在*右边指针不能改但内容可以改*两边都有const内容和指针都不能改。声明含义能否修改指针能否修改指向的内容const int *p或int const *p指向常量的指针✔️ 可以p x;❌ 不可以*p 10;错误int *const p x;常量指针❌ 不可以✔️ 可以*p 10;const int *const p x;指向常量的常量指针❌ 不可以❌ 不可以应用示例constchar*strHello;// 推荐写法字符串字面量是只读的// str[0] h; // × 运行时可能崩溃写只读内存strWorld;// √ 指针可变charbuffer[10];char*constptrbuffer;// 指针固定指向 bufferptr[0]A;// √ 内容可变// ptr another_buffer; // × 指针不可变3const 修饰函数这是const最重要的应用场景之一表达“只读”契约。① 修饰函数参数指针参数加 const指针参数就是形如void func(const int* x)voidprint_array(constintarr[],size_tn){for(size_ti0;in;i)printf(%d ,arr[i]);// √ 只读访问// arr[0] 999; // × 编译错误}等价于const int *arr表明函数不会修改传入的内容调用者可安全传入常量数组或普通数组。字符串处理函数的标准做法size_tmy_strlen(constchar*s);// 不修改 sintmy_strcmp(constchar*s1,constchar*s2);// 不修改 s1, s2所有标准库如strlen,strcpy,printf等对只读参数都使用const。值参数非指针参数加 const 对实参没啥影响但形参在函数内部不会被修改值参数就是形如void func(const int x)入口参数不是指针类型的。对于传入的变量实参C 函数参数默认是 “按值传递” 当你调用一个函数时实参的值会被复制到形参中这个传入的变量实参本来就不会被修改加不加const都一样。对于形参来说形参是函数内部的一个对实参的局部变量副本给值参数加const的效果等于在函数内部给局部变量加const表示在函数体内不能修改这个值。② 修饰函数返回值修饰返回的指针 —— 有意义constchar*get_version(void){returnv1.2.3;// 字符串字面量是只读的}返回const char*表示调用者不得修改返回的字符串其他类型类似。但不要返回局部变量的 const 指针constchar*bad_func(void){charbuf[10]temp;returnbuf;// ❌ 返回栈地址函数返回后无效}修饰返回的基本类型 —— 无意义constintgetValue(void){return42;}intxgetValue();函数返回的是临时值右值表示“临时值、计算结果”如字面量42字符串字面量天生就是 const 无法被赋值const 多余。C 标准允许但毫无作用现代编译器会忽略。4const 修饰数组和结构体① 常量数组查找表、配置表constuint8_tCRC_TABLE[256]{0x00,0x07,0x0E};编译器通常将其放入.rodata段只读数据段节省 RAM。适用于嵌入式系统中资源受限场景。② 结构体成员为 const较少用但合法structDeviceConfig{constintbaud_rate;constchar*constname;};// 初始化必须在定义时完成C99 支持复合字面量structDeviceConfigdev{.baud_rate115200,.nameUART0};// dev.baud_rate 9600; // × 错误5const 与 #define 的区别const是有类型、有作用域、可取地址的运行时常量本质是常变量在 C 中不是编译时常量而#define是无类型、无作用域、纯文本替换的预处理宏在必须使用编译时常量的地方const不可用。具体如下特性const变量#define宏类型有明确类型如const int无类型纯文本替换作用域遵循 C 作用域规则块、文件全局有效从定义到#undef存储占用内存除非被优化掉不占用内存预处理阶段替换取地址可以PI合法不可以宏不是对象调试调试器可查看符号和值调试器看不到宏已被替换安全性编译器检查类型和修改无任何检查易出错初始化运行时或编译时初始化必须是常量表达式数组大小C 标准中不能用于定义数组大小除非是 VLA 或 C23可以#define N 10int arr[N];示例对比使用#define传统方式#defineMAX_SIZE100#definePI3.14159intbuffer[MAX_SIZE];// √ 合法常量表达式使用const更安全但有限制constintMAX_SIZE100;// int buffer[MAX_SIZE]; // × C89/C99 中错误const 不是“编译时常量”关键点⚠️ 在 C 语言中const变量不是编译时常量因此不能用于数组长度除非是变长数组 VLAC99、case标签、位字段宽度等需要常量表达式的地方。解决方案✔️ 对于需要编译时常量的场景如数组大小仍需用#define或enum。对于运行时常量或需要类型安全的常量优先用const。推荐实践// 数组大小、开关选项 → 用 #define 或 enum#defineBUFFER_SIZE256enum{MAX_USERS10};// 数学常量、配置值 → 用 constconstdoubleEARTH_RADIUS_KM6371.0;constcharVERSION[]1.0.0;6总结在 C 语言中const的核心作用是声明只读对象通过类型系统告诉编译器和程序员该数据在初始化后不应被修改。它主要用于修饰指针参数防止函数意外修改传入的数据定义具有类型安全的常量变量替代部分宏以及返回只读指针保护内部数据不被外部篡改。const是有类型、有作用域、可取地址的运行时常量本质是常变量在 C 中不是编译时常量而#define是无类型、无作用域、纯文本替换的预处理宏在必须使用编译时常量的地方const不可用。强制类型转换可绕过const但属未定义行为可能崩溃或静默失败。

相关文章:

单片机/C语言八股:(十四)const 关键字的作用(和 define 比呢?)

上一篇下一篇C 语言实现矩阵乘法 目 录 const 关键字的作用(和 define 比呢?)1)const 修饰变量① 局部变量(函数内部)② 全局变量(文件作用域) 2)const 与指针的组合&…...

想学AI大模型应用开发,努力的顺序不能反!

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取...

2026年档案管理软件:数字时代的“记忆守护者“

2026年档案管理软件:数字时代的"记忆守护者" 在信息爆炸的今天,企业每天产生的文档数量呈指数级增长。一份合同、一张发票、一封邮件,这些看似普通的文件,实则承载着组织的核心记忆。如何高效管理这些"数字资产&qu…...

常用Git命令总结

Git(读音为/git/)是一个开源的分布式版本控制系统,凭借高效、灵活的特性,能够轻松处理从小型项目到大型项目的版本管理需求,是程序员日常开发中不可或缺的工具。 整理了自己日常开发中高频使用的Git命令,按…...

告别卡顿!AI写作大师Qwen3-4B CPU优化实战:16GB内存稳定运行技巧

告别卡顿!AI写作大师Qwen3-4B CPU优化实战:16GB内存稳定运行技巧 1. 为什么选择Qwen3-4B-Instruct在CPU上运行? 在大多数人的认知中,40亿参数的大模型似乎必须依赖高端GPU才能运行。然而,Qwen3-4B-Instruct通过精心设…...

Qt for Android(Android Studio) 连接各种模拟器

虚拟机按照Android机启动开发者模式雷电模拟器直接就可以使用1、夜神模拟器 nox_adb.exe connect 127.0.0.1:62001(效果不好)nox_adb.exe devices 2、通用: adb.exe connect 127.0.0.1:62001(暂不确定)...

如何设计一个可扩展的CRM客户管理模块

温馨提示:文末有资源获取方式 在企业数字化转型的浪潮中,CRM系统不再是简单的“客户通讯录”。一个设计优秀的客户管理模块,必须同时满足销售团队的易用性、管理层的可视化以及IT部门的二次开发需求。最近,帮企团队发布了一套基于…...

R语言双坐标轴实战:从base到ggplot2的5种方法对比与优化技巧

R语言双坐标轴可视化:5种方法深度解析与实战优化 1. 双坐标轴的应用场景与挑战 在科研数据可视化中,我们经常遇到需要同时展示两个量纲不同但存在关联的变量的需求。比如: 温度与降水量的季节性变化股价与交易量的关系微生物丰度与代谢物浓度…...

Qwen3-8B助力中小企业:低成本部署私有化AI知识库方案

Qwen3-8B助力中小企业:低成本部署私有化AI知识库方案 1. 为什么中小企业需要私有化AI知识库 在数字化转型浪潮中,中小企业面临着一个共同困境:如何在不投入巨额资金的情况下,获得与大企业相当的智能服务能力?传统AI解…...

避坑指南:在Win10上用PyCharm训练DeepLabV3+时,如何解决CUDA内存不足和依赖冲突?

Win10PyCharm实战:DeepLabV3训练中的7个致命陷阱与突围策略 当你在Windows 10上用PyCharm跑DeepLabV3模型时,是否遇到过这些场景:训练刚开始就爆显存、PyTorch版本冲突导致报错、修改配置后依然无法识别数据集?这些问题往往让初学…...

STM32 进阶封神之路(十七):RTC 实时时钟深度解析 —— 从时钟源到寄存器配置(底层原理 + 面试重点)

STM32 进阶封神之路(十七):RTC 实时时钟深度解析 —— 从时钟源到寄存器配置(底层原理 面试重点)上一篇我们掌握了 PWM 波输出的全场景应用,这一篇聚焦 STM32 的 “时间管理核心”——RTC 实时时钟。RTC&a…...

Wan2.1 VAE应用:构建智能数据库课程设计中的可视化数据生成模块

Wan2.1 VAE应用:构建智能数据库课程设计中的可视化数据生成模块 1. 引言 做数据库课程设计的同学,可能都遇到过这样的尴尬:你的ER图画得再漂亮,SQL语句写得再精妙,前端界面搭得再像模像样,一到演示环节&a…...

看完就会:毕业论文全流程降重神器 —— 千笔·专业降AIGC智能体

在AI技术迅猛发展的今天,越来越多的高校学生和研究人员开始借助AI工具提升论文写作效率。然而,随着知网、维普、万方等查重系统不断升级算法,以及Turnitin对AIGC内容的识别愈发严格,AI率超标问题逐渐成为学术写作中不可忽视的挑战…...

MiniMax M2.7 炸场发布:这不是升级,这是“降维打击”!国内第一梯队的恐怖实力彻底藏不住了

💣 MiniMax M2.7 炸场发布:这不是升级,这是“降维打击”!国内第一梯队的恐怖实力彻底藏不住了 “你们还在卷参数?人家已经开始让模型‘自己进化’了!” 今天是 2026年3月18日。 就在几个小时前,…...

CompreFace开源人脸识别:企业级部署的完整策略指南

CompreFace开源人脸识别:企业级部署的完整策略指南 【免费下载链接】CompreFace Leading free and open-source face recognition system 项目地址: https://gitcode.com/gh_mirrors/co/CompreFace 在当今数字化时代,人脸识别技术已成为身份验证、…...

5步实现Firecrawl批量数据采集的高效分布式任务调度

5步实现Firecrawl批量数据采集的高效分布式任务调度 【免费下载链接】firecrawl 🔥 Turn entire websites into LLM-ready markdown 项目地址: https://gitcode.com/GitHub_Trending/fi/firecrawl 批量数据采集——从多个网页同时获取信息的技术——已成为企…...

告别Modelsim!Notepad++配置NppExec实现Verilog实时语法检查(Windows环境避坑指南)

轻量化Verilog开发实战:Notepad与NppExec高效语法检查配置指南 引言:为什么选择Notepad作为Verilog开发工具? 在FPGA和数字电路设计领域,Verilog作为硬件描述语言的核心地位毋庸置疑。然而,传统IDE如Vivado、Modelsim的…...

数字孪生:平台化与定制化的双向赋能

当数字孪生从概念热潮中沉淀,步入实际应用深耕阶段,企业数字化转型常面临关键抉择:选择标准化平台方案快速入门,还是走个性化定制开发之路精准适配需求?这背后,是数字孪生产业中两条差异化路径的良性发展与…...

Qwen3-ForcedAligner在语音旅游中的应用:实时翻译与导览

Qwen3-ForcedAligner在语音旅游中的应用:实时翻译与导览 探索智能语音技术如何重塑旅游体验,让语言不再成为旅行的障碍 1. 引言:语音技术开启旅游新体验 想象一下这样的场景:你站在异国他乡的古老建筑前,耳边传来导游…...

在gpupixel中自定义锐化filter

文章目录基本的结构自定义头文件自定义源文件修改CMakeLists.txt参考基本的结构 class CustomFilter : public Filter {public:static std::shared_ptr<CustomFilter> Create();bool Init();virtual bool DoRender(bool updateSinks true) override;// Custom paramete…...

【数据集】【YOLOv11】【实例分割】路面积水精准分割数据集实战:从数据标注到城市内涝预警系统部署

1. 路面积水检测为什么需要YOLOv11&#xff1f; 第一次接触路面积水检测项目时&#xff0c;我用的是传统图像处理方法&#xff0c;结果被现实狠狠打脸。凌晨三点调试边缘检测算法&#xff0c;却发现雨天反光的路面让程序把每个水坑都识别成了"可疑物体"。这种经历让我…...

Win10下用VS2013编译LASTools避坑指南:从下载到测试全流程

Win10下用VS2013编译LASTools避坑指南&#xff1a;从下载到测试全流程 编译开源工具链时遇到的"玄学问题"&#xff0c;往往让开发者抓狂。LASTools作为激光雷达点云处理的瑞士军刀&#xff0c;其Windows平台编译过程尤其考验耐心。本文将带你完整走通从源码下载到测试…...

无人机精准降落进阶:OpenMV与Pixhawk的Mavlink通信全解析

无人机精准降落进阶&#xff1a;OpenMV与Pixhawk的Mavlink通信全解析 在无人机技术快速发展的今天&#xff0c;精准降落已成为工业级应用的关键能力。无论是物流配送、农业喷洒还是应急救援&#xff0c;精确到厘米级的降落控制都能显著提升作业效率和安全性。本文将深入探讨基于…...

多因素方差分析在金融信贷评估中的应用实践

1. 为什么金融信贷需要多因素方差分析 想象一下你是一位银行信贷审批员&#xff0c;每天要处理上百份贷款申请。有的客户提供房产抵押&#xff0c;有的找担保公司作保&#xff0c;还有的只凭个人信用。他们的信用记录也各不相同&#xff0c;有的按时还款从无逾期&#xff0c;有…...

Whisper语音识别镜像应用场景:自媒体博主批量生成视频字幕

Whisper语音识别镜像应用场景&#xff1a;自媒体博主批量生成视频字幕 1. 引言 1.1 自媒体博主的字幕困境 如果你是自媒体博主&#xff0c;一定经历过这样的场景&#xff1a;精心拍摄剪辑的视频终于完成&#xff0c;最后却卡在了字幕制作上。一条10分钟的视频&#xff0c;手…...

yyds!一个大模型的新方向,彻底爆发了!!2026年AI风口!掌握这3项技能,年薪百万不是梦!

文章指出2026年AI行业的最大机会在于应用层&#xff0c;企业纷纷布局Agent和大模型岗位需求激增。文章强调AI应用开发需要掌握RAG、Agent智能体和微调三项核心能力&#xff0c;并指出具备AI能力的程序员收入远超传统开发。文章推荐了一门《大模型应用开发实战训练》课程&#x…...

2026开发者实测:四大AI大模型API聚合网关SLA与延迟对决

搞AI开发的兄弟们&#xff0c;今年算力价格战打得很猛。GPT-5.4出了&#xff0c;Claude Opus 4.6和Sonnet 4.6也相继登场&#xff0c;官方单价确实降了。但作为一线开发者&#xff0c;大家心里都清楚&#xff0c;真正折磨人的是“管道成本”。 你写个Agent&#xff0c;跑10次调…...

RexUniNLU多场景落地实践:教育/金融/政务/电商/医疗五大领域案例

RexUniNLU多场景落地实践&#xff1a;教育/金融/政务/电商/医疗五大领域案例 想象一下&#xff0c;你手头有一堆杂乱无章的文档、客服聊天记录、用户评论&#xff0c;需要从中快速提取关键信息、分类归档、分析情感。传统方法要么需要大量人工标注&#xff0c;要么需要针对每个…...

智能控制Discord机器人:LiveBot高效管理解决方案

智能控制Discord机器人&#xff1a;LiveBot高效管理解决方案 【免费下载链接】LiveBot An app that allows you to be inside a bot! 项目地址: https://gitcode.com/gh_mirrors/li/LiveBot 核心价值&#xff1a;为何选择LiveBot重塑机器人管理体验&#xff1f; 在Disc…...

在服务器刻符咒:运维不敢碰的机柜——软件测试视角下的技术黑洞与破局之道

当玄学入侵测试生态在软件测试领域&#xff0c;环境完整性是保障覆盖率和缺陷检测的基石。然而&#xff0c;现实中存在一种隐形威胁&#xff1a;运维人员在故障频发的服务器机柜刻下符咒&#xff0c;将其列为“禁区”&#xff0c;导致测试团队被迫绕行。这种现象不仅源于人类心…...