【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语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

C# 中变量未赋值能用吗,各种类型的初始值是什么

对于一个局部变量,如果未赋值,是不能使用的 对于属性,未赋值,也能使用有系统默认值,默认值如下: 对于 int 类型,默认值是 0;对于 int? 类型,默认值是 null;对于 bool 类型,默认值是 false;对于 bool? 类型,默认值是 null;对于 string 类型,默认值是 null;对于 string? 类型,哈哈,没有这种写法,会出错;对于 DateTime 类型,默

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

【服务器运维】MySQL数据存储至数据盘

查看磁盘及分区 [root@MySQL tmp]# fdisk -lDisk /dev/sda: 21.5 GB, 21474836480 bytes255 heads, 63 sectors/track, 2610 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical)

人工和AI大语言模型成本对比 ai语音模型

这里既有AI,又有生活大道理,无数渺小的思考填满了一生。 上一专题搭建了一套GMM-HMM系统,来识别连续0123456789的英文语音。 但若不是仅针对数字,而是所有普通词汇,可能达到十几万个词,解码过程将非常复杂,识别结果组合太多,识别结果不会理想。因此只有声学模型是完全不够的,需要引入语言模型来约束识别结果。让“今天天气很好”的概率高于“今天天汽很好”的概率,得到声学模型概率高,又符合表达

SQL Server中,查询数据库中有多少个表,以及数据库其余类型数据统计查询

sqlserver查询数据库中有多少个表 sql server 数表:select count(1) from sysobjects where xtype='U'数视图:select count(1) from sysobjects where xtype='V'数存储过程select count(1) from sysobjects where xtype='P' SE

C#中,decimal类型使用

在Microsoft SQL Server中numeric类型,在C#中使用的时候,需要用decimal类型与其对应,不能使用int等类型。 SQL:numeric C#:decimal

C语言 将“China”译成密码

将“China”译成密码,密码规律是:用原来的字母后面的第4个字母代替原来的字母。例如,字母“A”后面的第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre”。编译程序用付赋初值的方法使c1,c2,c3,c4,c5这五个变量的值分别为“C”,“h”,“i”,“n”,“a”,经过运算,使c1,c2,c3,c4,c5分别变成“G”,“l”,“m”,“r”,“e”。分别用put

C语言入门系列:探秘二级指针与多级指针的奇妙世界

文章目录 一,指针的回忆杀1,指针的概念2,指针的声明和赋值3,指针的使用3.1 直接给指针变量赋值3.2 通过*运算符读写指针指向的内存3.2.1 读3.2.2 写 二,二级指针详解1,定义2,示例说明3,二级指针与一级指针、普通变量的关系3.1,与一级指针的关系3.2,与普通变量的关系,示例说明 4,二级指针的常见用途5,二级指针扩展到多级指针 小结 C语言的学习之旅中,二级