C语言深度剖析--不定期更新的第五弹

const关键字
来看一段代码:
#include <stdio.h>
int main()
{int a = 10;a = 20;printf("%d\n", a);return 0;
}
运行结果如下:

接下来我们在上面的代码做小小的修改:
#include <stdio.h>
int main()
{const int a = 10;a = 20;printf("%d\n", a);return 0;
}

编译器报出来警告。这是因为const修饰的变量,不能直接被修改
const既可以放在类型名之前也可以放在类型名之后
来看以下的代码:
#include <stdio.h>
int main()
{int a = 10;int* p = &a;printf("before:%d\n", a);*p = 20;printf("after:%d\n", a);return 0;
}
运行结果如下:

这里我们需要知道一个点*p=a,用来修改a的值
在此基础上做一点点修改:
int main()
{const int a = 10;int* p = (int*) & a;//这里需要进行强制类型转换,因为编译器会报出警告,因为类型不一致printf("before:%d\n", a);*p = 20;printf("after:%d\n", a);return 0;
}
运行结果如下:

得出结论:const修饰的变量可以被指针间接修改
总的来说,const修饰的变量并非不可修改的常量
const修饰的变量意义何在?
1.让编译器直接修改式检查
2.告诉其他程序员这个变量不能修改
注意一个点:

字符串常量是真正意义上的不可被修改**,这不是C语言层面上的,而是操作系统层面上的保护
const的价值不在于运行的时候,而是在于编译的时候
const只能在定义的时候直接初始化,不能二次赋值。为什么?
const int a;
a=120;//这是不对的,因为不能被修改了
const修饰数组
一般只能是只读数组,就是不能被修改的
如下:
const int arr[100]={1,2,3,4,5};
就不能进行修改里面的数据,如:arr[0]=2;,这样编译器会报错的
什么是指针?
指针就是地址,它是一种具体的数据

指针变量是一种变量,里面保存的是指针
再来看个例子:
int x=100;//空间,变量的属性,左值
int y=x;//内容,数据的属性,右值
任何一个变量名,在不同的应用场景中,代表不同的含义==
对于指针变量来说呢?
int a=10;
int*p=&a;
q=p;
和上面同理,指针变量和普通变量差不多,不要过度神化或者畏惧
需要做个刻意地小练习:在看到指针和指针变量的时候,一定要问自己这里指的是指针,就是地址,还是指针变量是一个变量。里面存的是地址
const修饰指针
科普一个概念:
指针的解引用
int a=10;
int*p=&a;
这里面有几个变量?
答案是2个

内存选址的单位是以字节为单位
我们这里拿a举例子,a是int类型的,4个字节,也就意味着有4个地址,但是取地址的时候不是全部取出来,取的是地址最低的那个
我们可以得出来一个结论:在C语言中,任何变量取地址都是从最低地址开始取
解引用:
*p=20;
int b=*p;
修饰指针

int a = 10;
const int* p = &a;//p指向的变量不可以直接被修改
*p = 100;//这是不对的
p = 100;
这里可能会有疑惑,const不是离int最近吗,为什么要看*,因为const是关键字,int也是关键字,会引起关键字冲突
第二种写法和第一种写法效果是一致的,但是我们更推荐第一种写法
int a = 10;int* const p = &a;//p的内容不能直接被修改,p指向不能改*p = 100;//p = 100;//这个不对
同理,第四个,两个都不行
再来看一组代码的对比:
代码1:
const int *p=&a;
int*q=p;
代码2:
int *p=&a;
const int*q=p;
代码1,会存在警告是因为左右两边类型不一致,左边是int*类型,右边是被const修饰的常量,需要在p前面加上(int *) ,进行强制类型转换;
代码2不会存在警告,这里是因为我们把一个类型不严格的变量赋值给一个类型严格的变量编译器是不会报出警告的
来看示例:
void show(const int*_p)
{printf("%d\n",*_p);printf("show p:%p\n",&_p);
}
int main()
{int a=10;int*p=&a;show(p);printf("main p:%p\n",&p);}
这是一种预防性编程,预防未来可能会出现的问题
在C语言中,任何函数参数都一定要形成临时变量,包括指针变量

打印出来的地址是不同的
const修饰函数
例子如下:
const int*GetVal()
{static int a=10;return &a;
}
int main()
{const int*p=GetVal();
}
这里函数用const修饰,目的是不希望有人在返回值的时候进行修改
一般内置类型返回,加const没有意义
相关文章:
C语言深度剖析--不定期更新的第五弹
const关键字 来看一段代码: #include <stdio.h> int main() {int a 10;a 20;printf("%d\n", a);return 0; }运行结果如下: 接下来我们在上面的代码做小小的修改: #include <stdio.h> int main() {const int a 1…...
python之事务
事务(Transaction)是数据库管理系统(DBMS)中的一个重要概念,用于确保一组数据库操作要么全部成功,要么全部失败,从而保证数据的一致性和完整性。 事务ACID 特性 事务具有以下四个特性…...
文件加密软件都有哪些?推荐6款文件加密工具
不久前,一家知名科技公司的内部文件在未经授权的情况下被泄露到了网络上,其中包括了公司的核心技术蓝图、客户名单及未来战略规划。这一事件不仅给公司带来了巨大的经济损失,还严重损害了企业的声誉。 如何防止以上事件的发生呢,文…...
Docker中的容器内部无法使用vi命令怎么办?
不知道你是否遇到过,在修改容器内部的配置的时候,有时候会提示vi命令不可用。尝试去安装vi插件,好像也不是很容易,有什么办法可以帮助我们修改这个配置文件呢? 解决办法 这时候,我们就需要用到docker cp 命令了,它可以帮助我们把容器内部的文件复制到宿主机上,也可以将…...
【Linux系统编程】TCP实现--socket
使用套接字socket实现服务器和客户端之间的TCP通信。 流程如下: 实现代码: /* server.c */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <arpa/inet.h> #include <s…...
企业微信hook协议接口,聚合群聊客户管理工具开发
服务提供了丰富的API和SDK,可以在企微的功能之上进行应用开发和功能扩展 自建应用可以调用企微hook或协议提供的接口来实现数据交互,可以直接调用hook或协议接口提供的功能来进行消息的发送与接收、用户管理、应用管理等操作,通过接口可以实…...
Selenium集成Sikuli基于图像识别的自动化测试
看起来您提供了一个链接,但目前我并没有从该链接获取到具体的信息内容。不过,如果您希望了解如何将Sikuli集成到Selenium中,我可以为您提供一些基本的指南。 什么是Sikuli? Sikuli是一款开源工具,用于基于图像识别的自动化测试。它可以识别屏幕上的图像,并模拟用户的交…...
【STM32实物】基于STM32设计的智能仓储管理系统(程序代码电路原理图实物图讲解视频设计文档等)——文末资料下载
基于STM32设计的智能仓储管理系统 演示视频: 基于STM32设计的智能仓储管理系统 摘要 近年来,随着我国仓储发展的和药品需求的不断增多,许多医院都采用药物仓储管理系统。我国的药物仓储产业已经有了长足的发展,仓库的规模不断变大,对仓储的要求也不断增高,药物的存储,…...
libtool 中的 .la 文件说明
libtool 中的 .la 文件说明 1 概述 在 Linux 系统中,libtool 是一个用于自动化编译和链接复杂软件项目的工具,特别是那些使用了共享库(.so 文件在 Linux 上,.dylib 在 macOS 上)的项目。它帮助处理各种编译器和链接器…...
NLP-transformer学习:(6)dataset 加载与调用
NLP-transformer学习:(6)dataset 加载与调用 平常其实也经常进行trainning等等,但是觉得还是觉得要补补基础,所以静下心,搞搞基础联系 本章节基于 NLP-transformer学习:(5࿰…...
数据库系统 第43节 数据库复制
数据库复制是一种重要的技术,用于在多个数据库系统之间同步数据。这在分布式系统中尤其重要,因为它可以提高数据的可用性、可扩展性和容错性。以下是几种常见的数据库复制类型: 主从复制 (Master-Slave Replication): 在这种模式下࿰…...
LabVIEW FIFO详解
在LabVIEW的FPGA开发中,FIFO(先入先出队列)是常用的数据传输机制。通过配置FIFO的属性,工程师可以在FPGA和主机之间,或不同FPGA VIs之间进行高效的数据传输。根据具体需求,FIFO有多种类型与实现方式&#x…...
如何验证VMWare WorkStation的安装?
如何验证VMWare WorkStation的安装? 右击"网络",点击 打开"网络和Internet设置",点击更改适配器选项,如果出现VMNet1和VMNet8,则说明安装成功。...
论文阅读:AutoDIR Automatic All-in-One Image Restoration with Latent Diffusion
论文阅读:AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion 这是 ECCV 2024 的一篇文章,利用扩散模型实现图像恢复的任务。 Abstract 这篇文章提出了一个创新的 all-in-one 的图像恢复框架,融合了隐扩散技术&#x…...
C++ | Leetcode C++题解之第392题判断子序列
题目: 题解: class Solution { public:bool isSubsequence(string s, string t) {int n s.size(), m t.size();vector<vector<int> > f(m 1, vector<int>(26, 0));for (int i 0; i < 26; i) {f[m][i] m;}for (int i m - 1; …...
操作系统概述(三、虚拟化)
系列文章目录 文章目录 系列文章目录前言十一、操作系统上的进程1. 从系统启动到第一个进程系统调用:fork(), 创建进程execv()PATH环境变量销毁进程 十二、进程的地址空间**查看进程的地址空间**进程地址空间管理进程地址空间隔离 十三、系统调用和 shell十四、C标准…...
基于ARM芯片与OpenCV的工业分拣机器人项目设计与实现流程详解
一、项目概述 项目目标和用途 本项目旨在设计和实现一套工业分拣机器人系统,能够高效、准确地对不同类型的物品进行自动分拣。该系统广泛应用于物流、仓储和制造业,能够显著提高工作效率,降低人工成本。 技术栈关键词 ARM芯片 步进电机控…...
UNITY UI简易反向遮罩
附带示例资源文件:https://download.csdn.net/download/qq_55895529/89726994?spm1001.2014.3001.5503 大致效果: 实现思路:通过ui shader的模板测试功能实现 通过让想要被突出显示的物体优先渲染并写入模板值,而后再让黑色遮罩渲染并判断模板值进行渲…...
牛客周赛59(A,B,C,D,E二维循环移位,F范德蒙德卷积)
比赛链接 官方讲解 很幸运参加了内测,不过牛客这消息推送天天发广告搞得我差点错过内测消息,差点进小黑屋,好在开赛前一天看到了。 这场不难,ABC都很签到,D是个大讨论,纯屎,E是需要对循环移位…...
C语言中的隐型计算
隐型计算(Implicit Computation)是C语言中一个不易察觉的特性,它发生在类型转换和操作顺序不明确的场合。隐型计算可能导致数据溢出、精度丢失或者不正确的结果。 例如,当你在一个int类型和unsigned类型混合的表达式中使用时&…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
