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

C语言深度剖析(部分)--剩下随缘更新

C语言深度剖析

关键字auto-最宽容大度的关键字

变量的分类

代码块:用{ }括起来的区域

局部变量:包含在代码块中的变量,局部变量具有临时性,进入代码块,自动形成局部变量,退出代码块自动释放。

全局变量:在所有函数外定义的变量。全局变量具有全局性。

作用域概念:指的是该变量可以被正常访问的代码区域

#include <stdio.h>
int main()
{int x=10;if(x==10){y=20;printf("%d %d",x,y);//x,y均可打印}printf("%d %d",x,y);//y会报错return 0;
}

局部变量:只在本代码块内有效

全局变量:整个程序运行期间都有效

生命周期

概念:变量从定义到被释放的时间范围,所谓的释放,是指曾经开辟的空间“被释放”

局部变量:进入代码块,形成局部变量(开辟空间),退出代码块,“释放”全局变量

全局变量:定义完成之后,程序运行的整个生命周期内,该变量一直有效

作用域VS生命周期

打个比方来说,有一位大富豪,从他出生到死亡所做的贡献,从时间的维度上来理解,我们可以说是生命周期,他所影响的范围可以叫做作用域,作用域更偏向于空间的维度来说

再来举个例子:

#include <stdio.h>
int g_val=20;
int main()
{int g_val=100;printf("%d",g_val);return 0;
}

当局部变量和全局变量命名起冲突的时候,编译器会优先考虑局部变量,所以打印结果为100

可以理解为就近原则

总结

作用域:该变量的有效范围

生命周期:时间的概念,什么时候被开辟,什么时候被释放
在这里插入图片描述

auto相关

如何使用:一般代码块中定义的变量,即局部变量,都是auto关键词修饰的,不过一般都是省略的

默认所有的变量都是auto修饰的吗?

不是,一般用来修饰局部变量

局部变量,临时变量,自动变量统称为局部变量

auto关键字已经很老,永不使用,在C语言中,但是C++和这个不一样

关键字 register-最快的关键字

铺垫知识:

在这里插入图片描述

寄存器的本质

在硬件层面上,提高计算机的运算效率。因为不需要从内存中读取数据啦。

register修饰变量

尽量将所修饰的变量放到CPU寄存区中,从而达到提高效率的目的

那么什么样的变量可以用register

1.局部的(全局会导致CPU寄存器长时间被占用)

2.不会被写入的(写入就需要写回内存,后续还需要读取检测,那么register的意义何在?)

3.是高频被读取的(提高效率)

4.如果要使用,不是大量使用(寄存器数量有限)

#include <stdio.h>
int main()
{register int a=10;printf("%d\n",a);return 0;
}

结果可以被正常打印,但是既然是存放在寄存器中,也就不是存储在内存中,所以不可以使用取地址符号&

关键字static-最名不副实的关键字

对extern声明的小小补充

当我要对一个函数进行声明的时候可不可以像如下情况:

extern int v_gal=100;

对这个变量进行了赋值,这是不可以的,因为声明并没有开辟空间,=100这是开辟空间或者初始化

所以我们得出结论

所有的变量声明的时候不能设置初始值

再来将讲一点:

我们这里是main.c这个源文件去调用test.c里的show()函数,倘若还有test1.c,test2.c,test3.c要去调用这个show()函数呢,所以:

单纯地使用源文件,组织项目结构的时候,项目越大越复杂的时候,维护成本会变得越来越高

这样也就诞生了头文件 .h

.h:头文件,组织项目结构的时候,减少大型项目的维护成本

接下来是对维护成本的解释:
还是拿刚刚的例子来举例,如果说我们要把上面的v_gal改成v_gal2,那么我们是不是要把所有的源文件声明的位置进行改动,如果说漏掉一个,,都会导致程序运行错误,这里还好只有四个源文件,但是如果是四十个,或者四百个呢,你试想一下。

综上,我们都在回答一个问题:为什么要有头文件

有关头文件的补充说明:

.h基本上都是要被多个源文件包含的,可能有一个问题,头文件被重复包含的问题,会导致运行效率降低

解决方案

在头文件开头写上#pragma once(**PS:**在VS2022中会默认加上#pragma once)
在这里插入图片描述

头文件包含以下内容:

  • C头文件

  • 所有的变量的声明

  • 所有的函数的声明

  • #define ,类型typedef, struct

在C语言中,包含头文件的两种形式

#include <stdio.h>这种是C语言库里面要包含的头文件

#include"test.h"是包含自定义的头文件

这个地方我们要特别注意的是函数的声明,因为在链接的过程中,test.c和main.c会进行匹配看是否有show()函数,即使说你已经定义了该函数,但是你没有声明的时候,编译器会忽视,所以要进行声明

书写如下:
在这里插入图片描述

不向里面添加函数体,道理和声明变量一个道理

注意

变量声明必须带上extern!!!

虽然在实际应用的时候编译器不会报错,但是你会无法区分是开辟空间还是声明变量

函数声明建议带上extern,为什么是建议呢。因为区别在于有没有函数体,编译器在识别的时候如果没有看到函数体会默认是函数的声明

几个小问题:

1.全局变量可以跨文件访问吗?可以

2.函数可以跨文件访问吗?可以

在具体的应用场景中,有没有可能我们不想让全局变量或者函数跨文件访问,指向本文件内部被访问

请出我们真正的主角-------static

在这里插入图片描述

看上面这幅图片,LNK表示的是链接的意思,这里是链接错误

static int g_val =100;//全局变量

访问吗?可以

在具体的应用场景中,有没有可能我们不想让全局变量或者函数跨文件访问,指向本文件内部被访问

请出我们真正的主角-------static

[外链图片转存中…(img-pPVbonaX-1723038243763)]

看上面这幅图片,LNK表示的是链接的意思,这里是链接错误

static int g_val =100;//全局变量

结论1:static修饰全局变量,该变量只能在本文件内被访问,不能被外部其他文件直接访问(可以被间接访问,如被函数调用)

相关文章:

C语言深度剖析(部分)--剩下随缘更新

C语言深度剖析 关键字auto-最宽容大度的关键字 变量的分类 代码块&#xff1a;用{ }括起来的区域 局部变量&#xff1a;包含在代码块中的变量&#xff0c;局部变量具有临时性&#xff0c;进入代码块&#xff0c;自动形成局部变量&#xff0c;退出代码块自动释放。 全局变量…...

计算机毕业设计选题推荐-电缆行业生产管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

Linux 下查看 CPU 使用率

目录 一、什么是 CPU 使用率二、查看 CPU 利用率1、使用 top 查看2、用 pidstat 查看3、用 ps 查看4、用 htop 查看5、用 nmon 查看6、用 atop 查看7、用 glances 查看8、用 vmstat 查看9、用 sar 查看10、dstat11、iostat 三、总结 CPU 使用率是最直观和最常用的系统性能指标&…...

数理基础知识

数理基础 大数定律期望方差常见分布伯努利分布泊松分布高斯分布服从一维高斯分布的随机变量KL散度服从多元高斯分布的随机变量KL散度 Gibbs不等式凸函数Jensen不等式 似然函数泰勒近似信息论信息量信息熵KL散度JS散度交叉熵 Wiener ProcessSDE 大数定律 期望方差 x为连续随机…...

Java解决lombok和mapstruct编译模块的问题

pom.xml <dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><!-- 1.18.16版本 --><version>${lombok.version}</version><scope>provided</scope><!-- 防…...

大模型场景应用全集:持续更新中

一、应用场景 1.办公场景 智能办公&#xff1a;文案生成&#xff08;协助构建大纲优化表达内容生成&#xff09;、PPT美化&#xff08;自动排版演讲备注生成PPT&#xff09;、数据分析&#xff08;生成公式数据处理表格生成&#xff09;。 智能会议&#xff1a;会议策划&…...

理解RabbitMQ中的消息存储机制:非持久化、持久化与惰性队列(Lazy Queue)

文章目录 1. 非持久化消息&#xff08;Transient Messages&#xff09;内存压力处理 2. 持久化消息&#xff08;Persistent Messages&#xff09;3. 惰性队列&#xff08;Lazy Queue&#xff09;官方推荐 总结 在RabbitMQ中&#xff0c;消息的存储和处理方式可以根据不同的需求…...

【机器学习】BP神经网络正向计算

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 BP神经网络正向计算1. 引言2. BP神经网络结构回顾3. 正向计算的基本原理4. 数学…...

谷粒商城实战笔记-108~109-elasticsearch删除与批量导入

一&#xff0c;108-全文检索-ElasticSearch-入门-put&post修改数据 第一种更新方式&#xff1a; POST customer/external/1/_update {"doc":{"name": "John Doew"} }第二种更新方式&#xff1a; POST customer/external/1 { "name&q…...

RabbitMQ:发送者的可靠性之使用消息确认回调

文章目录 配置RabbitMQ的ConfirmCallback使用ConfirmCallback发送消息实际使用中的注意事项总结 在开发消息驱动的系统时&#xff0c;消息的可靠传递至关重要。而RabbitMQ作为一个广泛使用的消息队列中间件&#xff0c;提供了多种消息确认机制&#xff0c;确保消息从生产者到交…...

HCIP学习 | OSPF---LSA限制、不规则区域、附录E、选路

目录 Days06&#xff08;24.8.8&#xff09;OSPF---LSA限制、不规则区域、附录E、选路 特殊区域 stub 区域&#xff0c; 末节区域 Totally stub &#xff1a;完全的末节区域 NSSA区域&#xff1a;(not so stub area) 非完全末节区域 完全的非完全的末节区域&#xff1a; …...

CVE-2017-15715~Apache解析漏洞【春秋云境靶场渗透】

Apache解析漏洞 漏洞原理 # Apache HTTPD 支持一个文件拥有多个后缀&#xff0c;并为不同后缀执行不同的指令。比如如下配置文件&#xff1a; AddType text/html .html AddLanguage zh-CN .cn# 其给 .html 后缀增加了 media-type &#xff0c;值为 text/html &#xff1b;给 …...

thinkphp 5.0.24生成模块

访问的形式生成模块&#xff1a; 1、需要在入口文件Public/index.php中加入以下代码&#xff1a; //生成Home模块&#xff0c;添加以下这句后&#xff0c;打开浏览器执行&#xff1a;http://www3.phptp5.com/public/index.php自动生成Home模块 \think\Build::module(Home); …...

值得注意!家里有带毛发动物就有浮毛?宠物空气净化器一键净化

上次跟朋友逛完街去她家&#xff0c;她家热情的哈基米开门就一个猛冲&#xff0c;我朋友接住就是一顿猛亲&#xff0c;亲猫一时爽&#xff0c;汗液粘着猫毛&#xff0c;粘得满手臂、满脸都是&#xff0c;看得鼻炎星人头皮发麻...好多养宠物的都说&#xff0c;梳毛根本不管用&am…...

Linux 代理(proxy)设置

有关网络代理的环境变量 环境变量说明可选的取值http_proxyhttp协议的网络连接使用该代理。ip:porthttp://ip:portsocks://ip:portsocks4://ip:portsocks5://ip:porthttps_proxyhttps协议的网络连接使用该代理。ftp_proxyftp协议使用该代理。all_proxy所有网络协议的网络连接都…...

操作系统真相还原:获取文件属性

14.15 获得文件属性 14.15.1 ls命令的幕后功臣 ls 命令中调用了大量的系统调用 stat64 和write &#xff0c;其中stat64 用于获得文件的属性信息&#xff0c; write 用于把信息输出到屏幕&#xff0c;即标准输出。这里的 stat64 表示 64 位版本的 stat。 其函数原型是int sta…...

聚鼎装饰画:投资一家装饰画店铺要花费多少钱

在艺术的殿堂里&#xff0c;每一幅装饰画都是静默的诗篇&#xff0c;而开设一家装饰画店铺&#xff0c;便是将这份静谧与美好呈现给世界的开始。然而&#xff0c;背后的投资成本&#xff0c;却是一笔需要精打细算的账。 店铺的选址&#xff0c;犹如画家挑选画布&#xff0c;至关…...

编程的魅力、其重要性、学习方法以及未来趋势

在数字化时代&#xff0c;编程已不仅仅是程序员的专属技能&#xff0c;它逐渐渗透到我们生活的方方面面&#xff0c;成为连接现实与虚拟世界的桥梁。从日常使用的智能手机应用到探索宇宙奥秘的超级计算机&#xff0c;编程的力量无处不在。本文将深入探讨编程的魅力、其重要性、…...

ubuntu init set

1 cuda驱动 cuda use not open test 自己下载安装 以上操作后可能是核显卡&#xff0c;需要执行下列进入独立显卡&#xff0c;才能进行HDMI链接 sudo prime-select nvidia sudo prime-select intel prime-select query 该命令用于查看目前的显卡使用模式&#xff0c;可以看到…...

MySQL数据分析进阶(八)存储过程

※食用指南&#xff1a;文章内容为‘CodeWithMosh’SQL进阶教程系列学习笔记&#xff0c;笔记整理比较粗糙&#xff0c;主要目的自存为主&#xff0c;记录完整的学习过程。&#xff08;图片超级多&#xff0c;慎看&#xff01;&#xff09; 【中字】SQL进阶教程 | 史上最易懂S…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...