【C语言天天练(零)】变量的存储类型

2024-04-20 12:48

本文主要是介绍【C语言天天练(零)】变量的存储类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言:

       

       对于初学C语言的人来说,经常让人感到混乱的一个问题是:定义的某个变量的作用域是什么、它的存储时期是什么以及它的链接类型是什么?其实,我们可以把一个变量的作用域、存储时期、链接统称为变量的存储类型。


存储类的特性:


       既然变量的存储类型有作用域、存储时期、链接三个特性,那么想要了解一个变量的存储类型,就不得不了解它的这三个特性是什么。



















       首先,一个变量的作用域指的是,该变量在C语言中的哪部分是可见可用的,是函数内部一个代码的片段?是整个函数内?或者是变量所在的整个文件?甚至是其它文件也可以使用该变量?

        对于一个C变量来说,链接有三种:空连接、内部链接、外部链接。具有代码块作用域或函数的变量是空连接,如上面代码中的val2和val3。文件作用域的变量可以是内部链接或外部链接。上例中的val1属于外部链接,若对val1变量加上static则为内部链接。

       最后,对于变量的存储时期分为静态存储时期和自动存储时期。其中,具有静态存储时期的变量,在程序执行期间一直存在,包括具有文件作用域的变量、或用static标注的具有函数(代码块)作用域的变量。如上例中的val1,或将val2用static表明,则val2同样具有静态存储时期。动态存储时期指的是:程序进入定义变量的代码块时,为变量分配内存,退出代码块时,内存分配被释放。如上例中的val2、val3。


存储类的类型:


       根据上面所说的特性,可以将变量分为五类:自动存储类变量、寄存器存储类变量、具有外部链接的静态存储类变量、具有内部链接的静态存储类变量、空链接的静态存储类变量。


       自动存储类变量,关键字是auto,默认情况下,在代码块或函数的头部定义的变量是自动存储类。它具有的特性是:自动存储时期、代码块作用域和空链接。注意:自动存储类不会被自动初始化为0,必须显示的初始化它。可以用常量、所有的变量已在先前定义过的表达式来初始化自动变量。例如

int main(void)

int ruth = ;

int rance = 5 * ruth;


       寄存器存储类变量:关键字是register,它的特性与自动存储类相同,自动存储时期、代码块作用域、空链接。注意:即使使用了register关键字表明变量,它也只是请求,而不是命令。编译器必须根据可用寄存器的个数与可用高速内存的数量来寻找平衡。另外,无法获得寄存器变量的地址。


       具有代码块作用域的静态变量:关键字是static,它的特性是静态存储时期、代码块作用域、空链接。注意:静态变量和外部变量在程序调入内存时已经就位了,它不是运行时执行的语句,这就是静态存储的意义,静态使得变量的位置固定不动。与上面所说的自动存储类不同,如果不显示的初始化静态变量,它们将被初始化为0。


       具有外部链接的静态变量:关键字extern,它的特性是静态存储时期、文件作用于、外部链接。一个外部变量只可以进行一次初始化,而且一定是在变量被定义时进行的。注意,不同于自动变量,外部变量只可以用常量表达式来初始化文件作用域变量。例如 :

int x = 10; // 正确

int x2 = 2 *10; // 不正确,x不是一个常量

       具有内部链接的静态变量:关键字static,它的特性是静态存储时期、文件作用域、内部链接。例如:

int traveler = 1; //外部链接

static int svil = 1; // 内部链接

int main(void)

{

.......

}


总结如下表:

存储类时期作用域链接声明方式
自动自动代码块代码块内
寄存器自动代码块代码块内,使用关键字static
具有外部链接的静态静态文件外部所有函数之外
具有内部链接的静态静态文件内部所有函数之外,使用关键字static
空链接的静态静态代码块代码块内,使用关键字static

这篇关于【C语言天天练(零)】变量的存储类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

Python如何查看数据的类型

《Python如何查看数据的类型》:本文主要介绍Python如何查看数据的类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python查看数据的类型1. 使用 type()2. 使用 isinstance()3. 检查对象的 __class__ 属性4.

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超