当前位置: 首页 > 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类型混合的表达式中使用时&…...

嵌入式开发中的寄存器操作与函数指针应用

1. 嵌入式开发中的寄存器操作技巧在嵌入式系统开发中&#xff0c;直接操作硬件寄存器是最基础也是最核心的技能之一。寄存器是CPU与外围设备交互的窗口&#xff0c;通过读写特定内存地址的寄存器&#xff0c;我们可以控制硬件的行为。下面我将详细介绍几种常见的寄存器操作方法…...

[Python3高阶编程] - [Python3高阶编程] - 异步编程深度学习指南三:手动实现AsyncRLock

一、手动实现 AsyncRLockimport asyncio from typing import Optionalclass AsyncRLock:def __init__(self):self._lock asyncio.Lock() # 底层互斥锁self._owner: Optional[asyncio.Task] None # 当前持有锁的协程&#xff08;Task&#xff09;self._count 0 …...

SEO优化对网站收录有什么作用

SEO优化对网站收录有什么作用 在当今互联网信息爆炸的时代&#xff0c;网站的收录问题显得尤为重要。SEO优化对于网站的收录有着至关重要的作用&#xff0c;无论是对于新开的网站还是已经运营一段时间的网站&#xff0c;优化都能为其带来更多的流量和潜在客户。SEO优化对网站收…...

湖南石材结晶公司

在长沙&#xff0c;无论是高端商场、星级酒店&#xff0c;还是政务大厅、三甲医院&#xff0c;光洁如镜、平整如砥的石材地面&#xff0c;都是其专业形象与高端质感的直接体现。然而&#xff0c;石材作为“面子工程”&#xff0c;长期承受高频人流、设备碾压&#xff0c;极易出…...

RAGFlow知识库配置与RAG流程优化实战

1. RAGFlow知识库配置详解 第一次接触RAGFlow知识库时&#xff0c;我被它强大的文档处理能力惊艳到了。记得当时处理一批科研论文PDF&#xff0c;传统方法提取的内容总是支离破碎&#xff0c;而RAGFlow的DeepDoc解析器完美保留了文档的图表和章节结构。下面我就把踩坑后总结的配…...

TP4056充电板实战避坑指南:从LED状态误判到TEMP脚悬空,新手最容易踩的5个坑

TP4056充电板实战避坑指南&#xff1a;从LED状态误判到TEMP脚悬空&#xff0c;新手最容易踩的5个坑 第一次使用TP4056充电板时&#xff0c;我盯着闪烁的LED灯陷入了困惑——为什么充满电后红灯还亮着&#xff1f;为什么电池发热异常&#xff1f;这些问题让我意识到&#xff0c;…...

Android安全漏洞案例分析:血淋淋的教训

Android安全漏洞案例分析&#xff1a;血淋淋的教训 Android安全漏洞案例分析&#xff1a;血淋淋的教训 案例一&#xff1a;Secret Token泄露导致账户劫持 漏洞危害&#xff1a;攻击者获取用户全部权限 某社交App在客户端硬编码了API密钥&#xff0c;攻击者通过反编译获取密钥…...

嵌入式编程规范:提升代码质量与团队协作效率

1. 嵌入式编程规范的重要性作为一名在嵌入式领域摸爬滚打多年的工程师&#xff0c;我深刻体会到代码规范的重要性。记得刚入行时接手过一个老项目&#xff0c;里面混杂着五种不同的命名风格和三套缩进规则&#xff0c;光是理清代码逻辑就花了两周时间。从那以后&#xff0c;我就…...

I.MX6U-MINI开发板系统固化全流程:从uboot编译到rootfs烧录(附网络配置技巧)

I.MX6U-MINI开发板系统固化实战指南&#xff1a;从零构建到网络调优 第一次拿到I.MX6U-MINI开发板时&#xff0c;面对系统固化的多个环节总有种无从下手的感觉。作为嵌入式Linux开发的入门门槛&#xff0c;系统固化不仅关系到后续应用开发的基础环境&#xff0c;更是理解嵌入式…...

管理员命令提示符 命令提示符 cmd

命令提示符区别...