Linux C语言:变量的作用域和生命周期(auto、register、static和extern)

一、变量存储类型-auto

1、auto变量的说明 

变量在程序中使用时,必须预先说明它们的存储类型和数据类型。
变量说明的一般形式是:

<存储类型> <数据类型 > <变量名> ;
  • <存储类型>是关键词auto、register、static和extern
  • <数据类型>可以是基本数据类型,也可以是自定义的数据类型 

2、 auto变量的存储类型

1)变量的存储类别决定了:

  • 变量的作用域:变量能够被使用的范围;针对的是程序编译链接阶段
  • 生命周期:变量创建(分配存储空间)到变量销毁(释放存储空间)之间的时间段(即变量的存在时间);针对的是程序的执行阶段;
  • 初始值 

 2)在函数体的某程序段内说明auto存储类型的变量时可以省略关键字auto,如下:

auto int k ;
int j ;
double x;

3)auto说明的变量只能在某个程序范围内使用,通常在函数体内或函数中的复合语句里。(默认是随机值),不能时全局变量。

二、变量存储类型-register 

1、register 变量的说明

变量的值是存放在内存中的。

  • 当程序中用到哪个变量的值时,有控制器发出指令将内存中该变量的值送到运算器中。
  • 经过运算器进行运算,如果需要存数,再从运算器将数据送到内存中存放。

如果一些变量使用频繁,为提高执行效率,允许将局部变量的值放在CPU中的寄存器中

  • 需要用时直接从寄存器中取出参加运算,不必再到内存中去取。
  • 由于对寄存器的存取速度远高于对内存的存取速度,因此这样可以提高执行效率。 

  • register称为寄存器型,用于定义局部变量,表示该变量尽可能存储在CPU的寄存器中,提高访问速度,初始值随机;
  • 寄存器是CPU内部的高速存储单元,比内存访问速度快很大,但数量有限,因此如申请不到就使用一般内存,同auto ;

2、案例 

不能用“&”来获取register变量的地址。 

  • 由于寄存器的数量有限,真正起作用的register修饰符的数目和类型都依赖于运行程序的机器。
  • 在某些情况下,把变量保存在寄存器中反而会降低程序的运行速度。因为被占用的寄存器不能再用于其它目的;或者变量被使用的次数不够多,不足以装入和存储变量所带来的额外开销。 

三、 变量存储类型-static

1、static变量的说明 

  • static变量称为静态存储类型的变量
  • 定义全局变量或局部变量,表示变量在程序运行期间一直存在
  • 默认初始值为0

2、static修饰局部变量  

局部变量使用static修饰,有以下特点:

  • 在内存中以固定地址存放的,而不是以堆栈方式存放
  • 只要程序没结束,就不会随着说明它的程序段的结束而消失,它下次再调用该函数,该存储类型的变量不再重新说明,而且还保留上次调用存入的数值。 

3、static修饰全部变量 

  • static修饰的全部变量,其它文件无法使用 

四、变量存储类型-extern

1、extern变量的说明

  • extern称为外部参照引用型,使用extern说明的变量是想引用在其它文件中函数体外部说明的变量。
  • 编译器在编译时不会给该变量分配内存,而是在链接阶段将其与实际的定义进行关联

2、extern声明外部变量 

  • 当你希望在一个文件中使用另一个文件中定义的全局变量时,需要在当前文件中使用extern进行变量的声明
  • 在当前文件中,它只是一个未定义的外部变量引用,实际定义在其它文件中 

3、extern声明全部变量

  • static修饰的全部变量,其它文件无法使用 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/711304.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Kafka】Kafka Producer 分区-05

【Kafka】Kafka Producer 分区-05 1. 分区的好处2. 分区策略2.1 默认的分区器 DefaultPartitioner 3. 自定义分区器 1. 分区的好处 &#xff08;1&#xff09;便于合理使用存储资源&#xff0c;每个Partition在一个Broker上存储&#xff0c;可以把海量的数据按照分区切割成一块…

《幻影大师:透视缠中说禅的虚像与真相》

而且他从不犯错&#xff0c;至少在他的叙述中是这样&#xff0c;所有的文章和言论都被粉饰得完美无瑕&#xff0c;即便有误&#xff0c;他也绝不公开承认&#xff0c;更别提什么真诚的道歉和改正了。那些对他推崇备至的人&#xff0c;多是盲目追随&#xff0c;将他神化为无所不…

YOLOv8可视化界面PYQT5

yolov8&#xff0c;可视化界面pyqt。支持图片检测&#xff0c;视频检测&#xff0c;摄像头检测等&#xff0c;实时显示检测画面。支持自定义数据集&#xff0c;计数&#xff0c;fps展示……,即插即用&#xff0c;无需更改太多代码

记一次全设备通杀未授权RCE的挖掘经历

想来上一次挖洞还在一年前的大一下&#xff0c;然后就一直在忙活写论文&#xff0c;感觉挺枯燥的&#xff08;可能是自己不太适合弄学术吧QAQ&#xff09;&#xff0c;所以年初1~2月的时候&#xff0c;有空的时候就又会挖一挖国内外各大知名厂商的设备&#xff0c;拿了几份思科…

---String类---

在c语言中要使用字符串&#xff0c;只能通过字符指针或者字符数组&#xff0c;然后再通过函数进行各种操作&#xff0c;这种将变量和变量方法分开的方式显然不符合面向对象的编程&#xff0c;所以java中添加了String这个类 String类构造 而对于string有很多的方法 字符串长度…

UWB技术定位系统源码,智慧工厂人员定位系统,独特的射频处理,配合先进的位置算法

UWB技术定位系统源码&#xff0c;高精度人员定位系统源码&#xff0c;智慧工厂人员定位系统源码&#xff0c;室内定位系统源码 本套系统运用UWB定位技术&#xff0c;开发的高精度人员定位系统&#xff0c;通过独特的射频处理&#xff0c;配合先进的位置算法&#xff0c;可以有…

结构体对齐,与 触发 segment fault 为什么是 1024*132 ,而不是1024*128

1, 简单的小示例代码 按理说 malloc 的size 是 1024*128&#xff0c;这里却需要 1024*132才能及时触发 segmentation fault #include <stdlib.h> #include <stdio.h> #define SIZE 1024*131int main() {char *p 0;p malloc(SIZE);p[SIZE -1] a;free(p);printf(…

【Mongodb-02】springboot整合mongodb(详解)

springBoot整和mongodb 一&#xff0c;springboot整合mongodb1&#xff0c;依赖加入2&#xff0c;yml文件配置3&#xff0c;_class 字段过滤(可选)4&#xff0c;实体类定义5&#xff0c;索引创建6&#xff0c;数据插入6.1&#xff0c;insert方式6.2&#xff0c;使用save的方式实…

Elixir学习笔记——输入输出和文件系统

本章介绍输入/输出机制、文件系统相关任务以及相关模块&#xff08;如 IO、File 和 Path&#xff09;。IO 系统提供了一个很好的机会来阐明 Elixir 和 Erlang VM 的一些思维模式和新奇思想。 输入输出模块 输入输出模块是 Elixir 中读写标准输入/输出 (:stdio)、标准错误 (:s…

Linux 终端窗口设置为透明

Linux 终端窗口设置为透明 打开终端 右键鼠标 选择Profile Preferences 点击Background 选择 Transparent background 拖动滑条调整透明度 完成。

【机器学习】集成学习方法:Bagging与Boosting的应用与优势

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 引言一、集成学习的定义二、Bagging方法1. 随机森林&#xff08;Random Forest&#xff09;2. 其他Bagging方法 二、Boosting方法1. 梯度提升树&#xff08;Gradient Boosting Machine, GBM&#xff09;解释GBM的基本原理和…

笔记本开机原理

从按下开机键开始&#xff0c;机器是如何开到OS的呢&#xff1f;今天这篇文章和大家极少EC-BIOS-OS的整个开机流程。首先大家要对笔记本的基本架构有所了解&#xff0c;基本架构如下图所示&#xff08;主要组成部分为大写黑体内容&#xff09;。 一、按下PowerButton按钮&#…

手把手带你搞定用户权限控制 | 纯干货

在实际的软件项目开发过程中&#xff0c;用户权限控制可以说是所有运营系统中必不可少的一个重点功能&#xff0c;根据业务的复杂度&#xff0c;设计的时候可深可浅&#xff0c;但无论怎么变化&#xff0c;设计的思路基本都是围绕着用户、角色、菜单这三个部分展开。 如何设计…

Matlab的Simulink系统仿真(simulink调用m函数)

这几天要用Simulink做一个小东西&#xff0c;所以在网上现学现卖&#xff0c;加油&#xff01; 起初的入门是看这篇文章MATLAB 之 Simulink 操作基础和系统仿真模型的建立_matlab仿真模型搭建-CSDN博客 写的很不错 后面我想在simulink中调用m文件 在 Simulink 中调用 MATLA…

Git 基础操作(一)

Git 基础操作 配置Git 安装完Git后&#xff0c;首先要做的事情是设置你的 用户名 和 e-mail 地址。这样在你向仓库提交代码的时候&#xff0c;就知道是谁提交的&#xff0c;以及提交人的联系方式。 配置用户名和邮箱 使用git config [--global] user.name "你的名字&qu…

失眠焦虑?这些维生素或许能帮你找回好眠!

&#x1f4a4; 失眠、焦虑&#xff0c;是现代生活中不少人都可能遇到的问题。长期的失眠与焦虑&#xff0c;不仅影响身体健康&#xff0c;更会对精神状态造成不小的冲击。其实&#xff0c;除了调整作息和放松心情&#xff0c;适当的维生素补充也可能有助于改善这些症状。 &…

SpringCloud-远程调用OpenFeign-基本使用

目录 1 直接使用RestTemplate发起Http请求 1.1 将RestTemplate注册为SpringBean 1.2 在service实现类中注入RestTemplate 1.3 使用注入的RestTemplate 传入参数后发起http请求 2 引入Nacos后使用RestTemplate发起Http请求 2.1 基础知识 2.2 Nacos的使用 2.2.1 引入nac…

Hvv--知攻善防应急响应靶机--Linux2

HW–应急响应靶机–Linux2 所有靶机均来自 知攻善防实验室 靶机整理&#xff1a; 夸克网盘&#xff1a;https://pan.quark.cn/s/4b6dffd0c51a#/list/share百度云盘&#xff1a;https://pan.baidu.com/s/1NnrS5asrS1Pw6LUbexewuA?pwdtxmy 官方WP&#xff1a;https://mp.weixin.…

Asp.Net Core 读取配置接口 IOptions、IOptionsMonitor以及IOptionsSnapshot

&#x1f340;简介 Options是.net Core Web api框架自带的功能&#xff0c;Options模式通过定义强类型的类来表示相关配置设置的集合&#xff0c;使得配置管理更为结构化和类型安全。 IOptions、IOptionsMonitor和IOptionsSnapshot是用于处理配置的依赖注入接口。这些接口允许…

Jenkins三种构建类型

目录 传送门前言一、概念二、前置处理&#xff08;必做&#xff09;1、赋予777权限2、让jenkins用户拥有root用户的kill权限3、要运行jar包端口号需要大于1024 三、自由风格软件项目&#xff08;FreeStyle Project&#xff09;&#xff08;推荐&#xff09;三、Maven项目&#…