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

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关键字 来看一段代码&#xff1a; #include <stdio.h> int main() {int a 10;a 20;printf("%d\n", a);return 0; }运行结果如下&#xff1a; 接下来我们在上面的代码做小小的修改&#xff1a; #include <stdio.h> int main() {const int a 1…...

python之事务

事务&#xff08;Transaction&#xff09;是数据库管理系统&#xff08;DBMS&#xff09;中的一个重要概念&#xff0c;用于确保一组数据库操作要么全部成功&#xff0c;要么全部失败&#xff0c;从而保证数据的一致性和完整性。 事务ACID 特性 事务具有以下四个特性&#xf…...

文件加密软件都有哪些?推荐6款文件加密工具

不久前&#xff0c;一家知名科技公司的内部文件在未经授权的情况下被泄露到了网络上&#xff0c;其中包括了公司的核心技术蓝图、客户名单及未来战略规划。这一事件不仅给公司带来了巨大的经济损失&#xff0c;还严重损害了企业的声誉。 如何防止以上事件的发生呢&#xff0c;文…...

Docker中的容器内部无法使用vi命令怎么办?

不知道你是否遇到过,在修改容器内部的配置的时候,有时候会提示vi命令不可用。尝试去安装vi插件,好像也不是很容易,有什么办法可以帮助我们修改这个配置文件呢? 解决办法 这时候,我们就需要用到docker cp 命令了,它可以帮助我们把容器内部的文件复制到宿主机上,也可以将…...

【Linux系统编程】TCP实现--socket

使用套接字socket实现服务器和客户端之间的TCP通信。 流程如下&#xff1a; 实现代码&#xff1a; /* server.c */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <arpa/inet.h> #include <s…...

企业微信hook协议接口,聚合群聊客户管理工具开发

服务提供了丰富的API和SDK&#xff0c;可以在企微的功能之上进行应用开发和功能扩展 自建应用可以调用企微hook或协议提供的接口来实现数据交互&#xff0c;可以直接调用hook或协议接口提供的功能来进行消息的发送与接收、用户管理、应用管理等操作&#xff0c;通过接口可以实…...

Selenium集成Sikuli基于图像识别的自动化测试

看起来您提供了一个链接,但目前我并没有从该链接获取到具体的信息内容。不过,如果您希望了解如何将Sikuli集成到Selenium中,我可以为您提供一些基本的指南。 什么是Sikuli? Sikuli是一款开源工具,用于基于图像识别的自动化测试。它可以识别屏幕上的图像,并模拟用户的交…...

【STM32实物】基于STM32设计的智能仓储管理系统(程序代码电路原理图实物图讲解视频设计文档等)——文末资料下载

基于STM32设计的智能仓储管理系统 演示视频: 基于STM32设计的智能仓储管理系统 摘要 近年来,随着我国仓储发展的和药品需求的不断增多,许多医院都采用药物仓储管理系统。我国的药物仓储产业已经有了长足的发展,仓库的规模不断变大,对仓储的要求也不断增高,药物的存储,…...

libtool 中的 .la 文件说明

libtool 中的 .la 文件说明 1 概述 在 Linux 系统中&#xff0c;libtool 是一个用于自动化编译和链接复杂软件项目的工具&#xff0c;特别是那些使用了共享库&#xff08;.so 文件在 Linux 上&#xff0c;.dylib 在 macOS 上&#xff09;的项目。它帮助处理各种编译器和链接器…...

NLP-transformer学习:(6)dataset 加载与调用

NLP-transformer学习&#xff1a;&#xff08;6&#xff09;dataset 加载与调用 平常其实也经常进行trainning等等&#xff0c;但是觉得还是觉得要补补基础&#xff0c;所以静下心&#xff0c;搞搞基础联系 本章节基于 NLP-transformer学习&#xff1a;&#xff08;5&#xff0…...

数据库系统 第43节 数据库复制

数据库复制是一种重要的技术&#xff0c;用于在多个数据库系统之间同步数据。这在分布式系统中尤其重要&#xff0c;因为它可以提高数据的可用性、可扩展性和容错性。以下是几种常见的数据库复制类型&#xff1a; 主从复制 (Master-Slave Replication): 在这种模式下&#xff0…...

LabVIEW FIFO详解

在LabVIEW的FPGA开发中&#xff0c;FIFO&#xff08;先入先出队列&#xff09;是常用的数据传输机制。通过配置FIFO的属性&#xff0c;工程师可以在FPGA和主机之间&#xff0c;或不同FPGA VIs之间进行高效的数据传输。根据具体需求&#xff0c;FIFO有多种类型与实现方式&#x…...

如何验证VMWare WorkStation的安装?

如何验证VMWare WorkStation的安装&#xff1f; 右击"网络"&#xff0c;点击 打开"网络和Internet设置"&#xff0c;点击更改适配器选项&#xff0c;如果出现VMNet1和VMNet8&#xff0c;则说明安装成功。...

论文阅读:AutoDIR Automatic All-in-One Image Restoration with Latent Diffusion

论文阅读&#xff1a;AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion 这是 ECCV 2024 的一篇文章&#xff0c;利用扩散模型实现图像恢复的任务。 Abstract 这篇文章提出了一个创新的 all-in-one 的图像恢复框架&#xff0c;融合了隐扩散技术&#x…...

C++ | Leetcode C++题解之第392题判断子序列

题目&#xff1a; 题解&#xff1a; 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. 从系统启动到第一个进程系统调用&#xff1a;fork(), 创建进程execv()PATH环境变量销毁进程 十二、进程的地址空间**查看进程的地址空间**进程地址空间管理进程地址空间隔离 十三、系统调用和 shell十四、C标准…...

基于ARM芯片与OpenCV的工业分拣机器人项目设计与实现流程详解

一、项目概述 项目目标和用途 本项目旨在设计和实现一套工业分拣机器人系统&#xff0c;能够高效、准确地对不同类型的物品进行自动分拣。该系统广泛应用于物流、仓储和制造业&#xff0c;能够显著提高工作效率&#xff0c;降低人工成本。 技术栈关键词 ARM芯片 步进电机控…...

UNITY UI简易反向遮罩

附带示例资源文件&#xff1a;https://download.csdn.net/download/qq_55895529/89726994?spm1001.2014.3001.5503 大致效果&#xff1a; 实现思路:通过ui shader的模板测试功能实现 通过让想要被突出显示的物体优先渲染并写入模板值,而后再让黑色遮罩渲染并判断模板值进行渲…...

牛客周赛59(A,B,C,D,E二维循环移位,F范德蒙德卷积)

比赛链接 官方讲解 很幸运参加了内测&#xff0c;不过牛客这消息推送天天发广告搞得我差点错过内测消息&#xff0c;差点进小黑屋&#xff0c;好在开赛前一天看到了。 这场不难&#xff0c;ABC都很签到&#xff0c;D是个大讨论&#xff0c;纯屎&#xff0c;E是需要对循环移位…...

C语言中的隐型计算

隐型计算&#xff08;Implicit Computation&#xff09;是C语言中一个不易察觉的特性&#xff0c;它发生在类型转换和操作顺序不明确的场合。隐型计算可能导致数据溢出、精度丢失或者不正确的结果。 例如&#xff0c;当你在一个int类型和unsigned类型混合的表达式中使用时&…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...