作者:吕老师,华清远见教育科技集团讲师。
变量是C语言基础也是核心的概念,对于初学C语言的同学来说变量的存储总是觉得比较混乱。这里对C的变量做一个简单的小结,希望对大家有所帮助。
我们看到对变量的讲解的时候看到很多概念,属性,存储期,内部链接,外部链接,空链接,全局变量,局部变量,寄存器变量,静态变量等等。看起来很混乱,下面我们梳理一下。
其实我们再使用变量的时候大多关心的只有三个方面:变量的存在期,变量的类型,变量的作用域。
我们想一下变量的定义方法分为三部分:
<存储类别> <变量的数据类型> <变量名>
分别理解一下
变量名。这个非常简单我们只要符合变量的命名规则就可以了,数字字母下划线组成,字母或下划线开头,不能为关键字。
变量的类型。这个也不难理解,我们知道有整形(int,long),字符型(char),浮点型(float,double),指针型(*)当然还有数组结构体等。相信这些我们再熟悉不过了。
存储类别。这个是我们今天讨论的重点。数据的存储类别决定了一个数据的存在期和作用域,我们先了解一下存在期和作用域这两个概念。
存在期:变量在内存中保存的时间。其实简单的说主要就两种情况,一是随函数的调用而起作用,随函数的结束而结束。二是作用于整个程序期间,直到程序结束。
作用域:变量能够有效作用的区域。这个简单的说有三种情况,一是只能作用在一个代码块内(或者说函数内),二是作用于整个文件(或者说程序)中,三是除了所在的文件别的文件也可以使用。
那么说了半天我们的存储类别是怎么决定存在期和作用域的呢。别急,就是通过下面几个关键字和变量定义所在的位置这两个条件的组合。
auto为存储类说明符,可以说明一个变量为自动变量。省略存数类型时默认就是auto修饰。所修饰的全局变量在静态区,局部变量在栈中。
register声明的变量属于寄存器存储类。所修饰的变量都在寄存器中保存。
static声明的变量属于静态存储类。所修饰的变量都在静态区。
外部变量的函数中使用extern关键字来再次声明。
我们把这几个关键字和位置的组合总结一下相信会清楚很多:
组合 | 存储期 | 作用域 | 初始值 |
auto +定义在函数内 | 和函数同步 | 函数内 | 不确定 |
auto +定义在函数外 | 和程序同步 | 本文件(程序)和外部文件 | 0 |
static+定义在函数内 | 和程序同步 | 函数内 | 0 |
static+定义在函数外 | 和程序同步 | 本文件(程序)内 | 0 |
register + 定义在函数内 | 和函数同步 | 函数内 | 不确定 |
说明一下,register只能修饰局部变量和形参,因为在寄存器内所以没有地址,也不可能是静态的。
extern :外部引用,当需要外部引用时使用,就不做过多阐述了。
这里只是讨论数据的存储,对关键字的一些其他功能就不做过多的说明了,不知道看了以上的表格对大家理解数据的存储期和作用域有没有一些帮助。