【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

相关文章

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

SpringBoot3.X 整合 MinIO 存储原生方案

《SpringBoot3.X整合MinIO存储原生方案》本文详细介绍了SpringBoot3.X整合MinIO的原生方案,从环境搭建到核心功能实现,涵盖了文件上传、下载、删除等常用操作,并补充了... 目录SpringBoot3.X整合MinIO存储原生方案:从环境搭建到实战开发一、前言:为什么选择MinI

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二