【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

相关文章

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路