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使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

Linux Mint Xia 22.1重磅发布: 重要更新一览

《LinuxMintXia22.1重磅发布:重要更新一览》Beta版LinuxMint“Xia”22.1发布,新版本基于Ubuntu24.04,内核版本为Linux6.8,这... linux Mint 22.1「Xia」正式发布啦!这次更新带来了诸多优化和改进,进一步巩固了 Mint 在 Linux 桌面

LinuxMint怎么安装? Linux Mint22下载安装图文教程

《LinuxMint怎么安装?LinuxMint22下载安装图文教程》LinuxMint22发布以后,有很多新功能,很多朋友想要下载并安装,该怎么操作呢?下面我们就来看看详细安装指南... linux Mint 是一款基于 Ubuntu 的流行发行版,凭借其现代、精致、易于使用的特性,深受小伙伴们所喜爱。对