C++和C中const的区别详解
const这个词字面意思为常数。这就表示这是一个不可以改变是数。同时这也是C/C里面的一个关键字是一个限定符但是const在C和C中的用法是有区别的。由于本人水平有限难免会有出错的地方如果错误还请指正C中的constconst修饰局部变量在C语言中const修饰局部变量那么这个变量就是“常变量”。12345678voidtest(){constintb 20;}intmain() {constinta 10;return0;}上面的两个变量无论是主函数中的a还是普通的函数中的b都是被从const修饰的变量那么就是“常变量”。“常变量”不可以直接通过变量名来对值进行修改因为变量名被const修饰后从原来的“可读可改”的属性变成了只“可读”“不可改”的属性。12345678910voidtest(){constintb 20;b 40;//error}intmain() {constinta 10;a 30;//errorreturn0;}上面的行为是错误的。但是“常变量”本质上还是一个“变量”而不是“常量”。只要是被const修饰的局部变量都是在程序运行到这一行代码的时候才会创建这个变量并且分配空间的。而分配空间是在栈区分配的栈区的空间都会有对应的地址栈区的空间是“可读可写”的。我们可以通过地址来对值进行修改。1234567891011121314151617#includestdio.hvoidtest() {constintb 20;int* pb b;*pb 40;printf(%d\n, b);}intmain() {constinta 10;int* pa a;*pa 30;printf(%d\n, a);test();return0;}上面的代码输出的结果是30和40也就是说不论是main函数中的还是普通函数中的局部变量只要是被const修饰的局部变量是可以通过地址来进行修改的。补充一般我们在定义一个被const修饰的变量的时候都应该定义并且初始化如果像上面的那样是被const修饰的局部变量如果我们在定义的时候不进行初始化那么就是一个随机值想要修改就只能通过指针了。const修饰全局变量const修饰的全局变量也就是定义在函数体之外的变量内存空间是在文字常量区的这个内存区域是只读的不能通过变量名去修改变量的值也不能通过指针去修改变量的值1234567constinta 10;//全局变量intmain() {int* pa a;*pa 30;printf(%d\n, a);return0;}上面的代码时错误的被const修饰的全局变量不能通过变量名和地址对内容进行修改程序会报错。const修饰的全局变量有外部链接属性在C语言中只要时全局变量不论有没有被const修饰都是默认拥有外部链接属性的也就是说这个全局变量不仅限于在当前文件下使用只要我们在其他文件中加上extern的声明也是可以使用的。const与指针当const修饰非指针的普通变量的时候不论const放在类型关键字前面还是后面表达的意思都是一样的12345678910111213#includestdio.hconstintc 5;intconstc 5;voidtest() {constintb 20;intconstb 20;}intmain() {constinta 10;intconsta 10;return0;}上面abc三个变量的两种写法表达的意思都是一样的当然同名的变量不能重复定义我只是演示一下而已。当const修饰指针的时候不同的写法会代表不同的意思。12345678intmain() {constinta 10;//const int* pa a;//与下一行的代码表达的意思一样intconst* pa a;*pa 30;printf(%d\n, a);return0;}上面的代码时有错的const修饰指针的时候const在*星号的左边(上面演示的两种情况都可以)那么表示的是指针pa指向的空间的内容不可以修改但是指针变量本身的值可以修改也就是该指针变量可以改变指向的空间。123456789intmain() {constinta 10;intb 20;int*constpa a;*pa 30;pa b;//errorprintf(%d\n, a);return0;}上面的代码是错误的const在*星号的右边那么表示的是指针变量pa里面存放的地址不可以被修改也就是不能修改当前指针变量所指向的空间但是空间的内容可以通过指针来进行修改。C中的constconst修饰普通全局变量与C一样当const修饰普通的全局变量的时候不能通过变量名和地址来修改变量的值。另外与C不一样的是C语言中的const修饰的普通全局变量默认是外部链接属性的但是在C中被const修饰的普通全局变量是内部链接属性的。也就是说当我们在一个文件中定义了一个如下的全局变量1234constinta 10;//定义全局变量intmain() {return0;}我们在另外一个文件中使用extern来声明也是不可以的。12//另外一个文件externconstinta;//在另外的文件中声明上面这种做法是不可以的C中被const修饰的全局变量默认是内部链接属性不能直接在另外的文件中使用如果想要在另外的文件中使用就需要在定义该全局的变量的文件中用extern来修饰。1234//定义的文件externconstinta 10;//另外一个文件声明externconstinta;const修饰普通局部变量如果const修饰的局部变量是基础的类型(int char double等等)并且初始化使用字面常量的话不会给该变量分配空间。例如1234voidtest() {constinta 10;//用字面常量10来初始化a 20;//error}但是当我们对这个变量进行取地址的操作的时候系统会为该变量分配空间。12345678voidtest() {constinta 10;//a 20;//errorint* p (int*)a;*p 20;cout a endl;cout *p endl;}上面的结果是10和20这是因为当我们定义一个被const修饰并且使用字面常量来初始化的局部变量的时候系统会把这个变量看作是一个符号放入到符号表中这么变量名就是一个符号值就是这个符号的值类似于#define的作用。当我们对这个变量取地址的时候由于原来没有空间就没有地址现在需要取地址所以才被迫分配一块空间我们通过地址的解引用可以修改这个空间的值这也就是为什么第二个结果为20的原因但是如果我们还是通过变量名来访问数据的话系统会认为这还是一个符号直接用符号表里面的值替换。但是如果初始化不是用字面常量而是用变量那么系统会直接分配空间。1234voidtest() {intb 20;constinta b;}这时候的a是有空间的不会被放入到符号表中。const与类如果是自定义数据类型(结构体、对象)我们在创建对象(结构体)的时候如果这个对象是被const修饰的话那么不管这个对象是全局的还是局部的系统都会直接分配空间总结本篇文章就到这里了希望能够给你带来帮助也希望您能够多多关注脚本之家的更多内容!const这个词字面意思为常数。这就表示这是一个不可以改变是数。同时这也是C/C里面的一个关键字是一个限定符但是const在C和C中的用法是有区别的。由于本人水平有限难免会有出错的地方如果错误还请指正C中的constconst修饰局部变量在C语言中const修饰局部变量那么这个变量就是“常变量”。12345678voidtest(){constintb 20;}intmain() {constinta 10;return0;}上面的两个变量无论是主函数中的a还是普通的函数中的b都是被从const修饰的变量那么就是“常变量”。“常变量”不可以直接通过变量名来对值进行修改因为变量名被const修饰后从原来的“可读可改”的属性变成了只“可读”“不可改”的属性。12345678910voidtest(){constintb 20;b 40;//error}intmain() {constinta 10;a 30;//errorreturn0;}上面的行为是错误的。但是“常变量”本质上还是一个“变量”而不是“常量”。只要是被const修饰的局部变量都是在程序运行到这一行代码的时候才会创建这个变量并且分配空间的。而分配空间是在栈区分配的栈区的空间都会有对应的地址栈区的空间是“可读可写”的。我们可以通过地址来对值进行修改。1234567891011121314151617#includestdio.hvoidtest() {constintb 20;int* pb b;*pb 40;printf(%d\n, b);}intmain() {constinta 10;int* pa a;*pa 30;printf(%d\n, a);test();return0;}上面的代码输出的结果是30和40也就是说不论是main函数中的还是普通函数中的局部变量只要是被const修饰的局部变量是可以通过地址来进行修改的。补充一般我们在定义一个被const修饰的变量的时候都应该定义并且初始化如果像上面的那样是被const修饰的局部变量如果我们在定义的时候不进行初始化那么就是一个随机值想要修改就只能通过指针了。const修饰全局变量const修饰的全局变量也就是定义在函数体之外的变量内存空间是在文字常量区的这个内存区域是只读的不能通过变量名去修改变量的值也不能通过指针去修改变量的值1234567constinta 10;//全局变量intmain() {int* pa a;*pa 30;printf(%d\n, a);return0;}上面的代码时错误的被const修饰的全局变量不能通过变量名和地址对内容进行修改程序会报错。const修饰的全局变量有外部链接属性在C语言中只要时全局变量不论有没有被const修饰都是默认拥有外部链接属性的也就是说这个全局变量不仅限于在当前文件下使用只要我们在其他文件中加上extern的声明也是可以使用的。const与指针当const修饰非指针的普通变量的时候不论const放在类型关键字前面还是后面表达的意思都是一样的12345678910111213#includestdio.hconstintc 5;intconstc 5;voidtest() {constintb 20;intconstb 20;}intmain() {constinta 10;intconsta 10;return0;}上面abc三个变量的两种写法表达的意思都是一样的当然同名的变量不能重复定义我只是演示一下而已。当const修饰指针的时候不同的写法会代表不同的意思。12345678intmain() {constinta 10;//const int* pa a;//与下一行的代码表达的意思一样intconst* pa a;*pa 30;printf(%d\n, a);return0;}上面的代码时有错的const修饰指针的时候const在*星号的左边(上面演示的两种情况都可以)那么表示的是指针pa指向的空间的内容不可以修改但是指针变量本身的值可以修改也就是该指针变量可以改变指向的空间。123456789intmain() {constinta 10;intb 20;int*constpa a;*pa 30;pa b;//errorprintf(%d\n, a);return0;}上面的代码是错误的const在*星号的右边那么表示的是指针变量pa里面存放的地址不可以被修改也就是不能修改当前指针变量所指向的空间但是空间的内容可以通过指针来进行修改。

相关新闻

微信小程序授权登录弹窗:从基础实现到用户体验优化

微信小程序授权登录弹窗:从基础实现到用户体验优化

1. 微信小程序授权登录基础实现微信小程序的授权登录是用户进入小程序后的第一个关键交互节点。不同于传统APP繁琐的注册流程,小程序通过微信生态的天然优势,让用户只需点击两次就能完成身份认证。这种便捷性背后,是一套精心设计的授权体系。…

2026/7/6 11:51:00阅读更多 →
免费升级老旧Mac:OpenCore Legacy Patcher终极指南

免费升级老旧Mac:OpenCore Legacy Patcher终极指南

免费升级老旧Mac:OpenCore Legacy Patcher终极指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为苹果官方不再支持的老款Mac而烦恼吗&…

2026/7/6 11:51:00阅读更多 →
从DVWA到实战:手把手教你用sqlmap进行SQL注入漏洞检测

从DVWA到实战:手把手教你用sqlmap进行SQL注入漏洞检测

1. SQL注入漏洞检测入门指南SQL注入是Web安全测试中最常见的漏洞类型之一。简单来说,攻击者通过在输入字段中插入恶意SQL代码,欺骗数据库执行非预期的命令。这可能导致数据泄露、数据篡改甚至整个系统沦陷。我第一次接触SQL注入是在五年前的一次内部安全…

2026/7/6 11:51:00阅读更多 →
计算机专业就业:换个角度从问题拆解到交付验证,从方案设计到上线检查

计算机专业就业:换个角度从问题拆解到交付验证,从方案设计到上线检查

聊《计算机专业就业:换个角度,从问题拆解到交付验证》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要这篇面向计算机专业学生、应届生和转专业学习者,但不会把“计算机专业就…

2026/7/6 13:01:23阅读更多 →
PowerToys Text Extractor:解锁屏幕文字的智能钥匙,让每一段文字都触手可及

PowerToys Text Extractor:解锁屏幕文字的智能钥匙,让每一段文字都触手可及

PowerToys Text Extractor:解锁屏幕文字的智能钥匙,让每一段文字都触手可及 【免费下载链接】PowerToys Microsoft PowerToys is a collection of utilities that supercharge productivity and customization on Windows 项目地址: https://gitcode.c…

2026/7/6 13:01:23阅读更多 →
解锁B站缓存视频:m4s-converter让你的珍贵收藏重获新生

解锁B站缓存视频:m4s-converter让你的珍贵收藏重获新生

解锁B站缓存视频:m4s-converter让你的珍贵收藏重获新生 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经遇到过这样的困境&…

2026/7/6 13:01:23阅读更多 →
如何快速修改Palworld存档:专业工具完整指南

如何快速修改Palworld存档:专业工具完整指南

如何快速修改Palworld存档:专业工具完整指南 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools Palworld存档编辑工具是一款专为《幻兽帕…

2026/7/6 13:01:23阅读更多 →
115proxy-for-kodi终极指南:让电视直接播放115云盘视频的完整教程

115proxy-for-kodi终极指南:让电视直接播放115云盘视频的完整教程

115proxy-for-kodi终极指南:让电视直接播放115云盘视频的完整教程 【免费下载链接】115proxy-for-kodi 115原码播放服务Kodi插件 项目地址: https://gitcode.com/gh_mirrors/11/115proxy-for-kodi 还在为电视播放115云盘视频而烦恼吗?每次都要下载…

2026/7/6 13:01:23阅读更多 →
舵机 PD 控制参数整定指南:从 P 项振荡到 D 项抑制的 4 步调参法

舵机 PD 控制参数整定指南:从 P 项振荡到 D 项抑制的 4 步调参法

舵机PD控制参数整定实战:从振荡抑制到赛道循迹的4步调参法在智能车竞赛和机器人控制领域,舵机的精准转向控制往往是决定胜负的关键因素。许多参赛队伍在调试初期都会遇到这样的困境:要么车辆在直道上左右摇摆像喝醉了酒,要么入弯时…

2026/7/6 12:56:22阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/6 4:26:20阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/6 2:48:33阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/6 0:10:35阅读更多 →
Seraphine:基于LCU API的英雄联盟智能游戏助手技术解析与应用指南

Seraphine:基于LCU API的英雄联盟智能游戏助手技术解析与应用指南

Seraphine:基于LCU API的英雄联盟智能游戏助手技术解析与应用指南 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 技术架构先行:官方接口的合规应用 你是否曾在BP阶段手忙脚乱&#x…

2026/7/6 0:03:39阅读更多 →
多协议远程连接管理工具mRemoteNG:告别混乱,统一你的远程桌面管理

多协议远程连接管理工具mRemoteNG:告别混乱,统一你的远程桌面管理

多协议远程连接管理工具mRemoteNG:告别混乱,统一你的远程桌面管理 【免费下载链接】mRemoteNG mRemoteNG is the next generation of mRemote, open source, tabbed, multi-protocol, remote connections manager. 项目地址: https://gitcode.com/gh_m…

2026/7/6 0:03:39阅读更多 →
COUNT(DISTINCT) 与 GROUP BY 去重统计:5 亿数据量下的性能实测与选型指南

COUNT(DISTINCT) 与 GROUP BY 去重统计:5 亿数据量下的性能实测与选型指南

COUNT(DISTINCT) 与 GROUP BY 去重统计:5 亿数据量下的性能实测与选型指南在数据分析和处理领域,去重统计是最基础也是最频繁使用的操作之一。当数据量达到亿级规模时,不同的去重统计方法在性能上可能产生天壤之别。本文将基于 5 亿行数据的实…

2026/7/6 0:03:39阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/6 4:45:01阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/6 4:45:01阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/6 4:45:03阅读更多 →