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

本文主要是介绍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修饰的全部变量,其它文件无法使用 

这篇关于Linux C语言:变量的作用域和生命周期(auto、register、static和extern)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1057945

相关文章

linux生产者,消费者问题

pthread_cond_wait() :用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人习惯的路径 /opt/tomcat-10

C# 中变量未赋值能用吗,各种类型的初始值是什么

对于一个局部变量,如果未赋值,是不能使用的 对于属性,未赋值,也能使用有系统默认值,默认值如下: 对于 int 类型,默认值是 0;对于 int? 类型,默认值是 null;对于 bool 类型,默认值是 false;对于 bool? 类型,默认值是 null;对于 string 类型,默认值是 null;对于 string? 类型,哈哈,没有这种写法,会出错;对于 DateTime 类型,默

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。  从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

Windows/macOS/Linux 安装 Redis 和 Redis Desktop Manager 可视化工具

本文所有安装都在macOS High Sierra 10.13.4进行,Windows安装相对容易些,Linux安装与macOS类似,文中会做区分讲解 1. Redis安装 1.下载Redis https://redis.io/download 把下载的源码更名为redis-4.0.9-source,我喜欢跟maven、Tomcat放在一起,就放到/Users/zhan/Documents

Linux系统稳定性的奥秘:探究其背后的机制与哲学

在计算机操作系统的世界里,Linux以其卓越的稳定性和可靠性著称,成为服务器、嵌入式系统乃至个人电脑用户的首选。那么,是什么造就了Linux如此之高的稳定性呢?本文将深入解析Linux系统稳定性的几个关键因素,揭示其背后的技术哲学与实践。 1. 开源协作的力量Linux是一个开源项目,意味着任何人都可以查看、修改和贡献其源代码。这种开放性吸引了全球成千上万的开发者参与到内核的维护与优化中,形成了