【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++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

C语言逗号运算符和逗号表达式的使用小结

《C语言逗号运算符和逗号表达式的使用小结》本文详细介绍了C语言中的逗号运算符和逗号表达式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接其一般形式为:表达

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

C# WebAPI的几种返回类型方式

《C#WebAPI的几种返回类型方式》本文主要介绍了C#WebAPI的几种返回类型方式,包括直接返回指定类型、返回IActionResult实例和返回ActionResult,文中通过示例代码介绍的... 目录创建 Controller 和 Model 类在 Action 中返回 指定类型在 Action

Nginx内置变量应用场景分析

《Nginx内置变量应用场景分析》Nginx内置变量速查表,涵盖请求URI、客户端信息、服务器信息、文件路径、响应与性能等类别,这篇文章给大家介绍Nginx内置变量应用场景分析,感兴趣的朋友跟随小编一... 目录1. Nginx 内置变量速查表2. 核心变量详解与应用场景3. 实际应用举例4. 注意事项Ng

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared

Go语言中如何进行数据库查询操作

《Go语言中如何进行数据库查询操作》在Go语言中,与数据库交互通常通过使用数据库驱动来实现,Go语言支持多种数据库,如MySQL、PostgreSQL、SQLite等,每种数据库都有其对应的官方或第三... 查询函数QueryRow和Query详细对比特性QueryRowQuery返回值数量1个:*sql

GO语言中gox交叉编译的实现

《GO语言中gox交叉编译的实现》本文主要介绍了GO语言中gox交叉编译的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、安装二、使用三、遇到的问题1、开启CGO2、修改环境变量最近在工作中使用GO语言进行编码开发,因