目录
一、auto变量
二、extern变量
三、static变量
static的作用为:
1.修饰全局变量
2.修饰局部变量
3.修饰函数
四、register变量
一、auto变量
若定义一个局部变量为自动变量,这意味着每次执行到定义该变量都回产生一个新变量,并对他重新初始化。这里的auto可以省略,如果不特定指明,局部变量的存储方式默认为自动的。
int fun(int a){auto int b,c;/* 此处省略内容*/}
这个函数中a为形参,b,c为自动变量,执行fun函数后,自动释放a,b,c所占的存储单元。
二、extern变量
如果某全局变量(注意只有全局变量才可以在外部使用)或函数在同时编译的其他源文件中已经定义,当在当前源文件中这个变量或函数被extern修饰,则表明从声明开始就可以合法的在当前源文件中使用该变量或函数了。
例:
/*file1.c */int x = 1;int fun();int fun(){/*此处省略函数内容*/}/* file2.c */extern int x; /*该变量是已经在file1.c文件中定义,这里只需声明*/extern int fun(); /*该函数是已经在file1.c文件中定义,这里只需声明*/int main(){printf("x = %d",x);fun();return 0;}
三、static变量
可以想成static变量就是“专一”的,当用static声明变量后,该变量的始终保持他的值,初始化操作只在第一次起作用。
static的作用为:
1.修饰全局变量
全局变量是具有外部链接属性的,static修饰全局变量后,将外部链接属性变成了内部链接属性,此时的全局变量只能在自己所在的.c文件中使用,其他文件中无法链接使用,这样给我们的感觉是影响了变量的作用域。(代码演示如下)
2.修饰局部变量
static修饰局部变量的时候改变了这个变量的生命周期。但是,不影响作用域
static修饰局部变量,是改变了变量的存储类型本来局部变量是放在栈区的,被static修饰后存放内存的静态区了,因为存储类型的改变,从而导致生命周期变长。
上述两图不同的是a变量有没有被static修饰,如果修饰了,则a就被改变到存放在静态区,使得a变量的生命周期改变。
3.修饰函数
函数是具有外部链接属性的,static修饰全局变量后,将外部链接属性变成了内部链接属性,此时的该函数只能在自己所在的.c文件中使用,其他文件中无法链接使用(下面两个代码对比如下)
这里补充一下内存中的变量存储方式,内存分三块区域,栈区,堆区,静态区。对应的存储数据类型如下图所示。
特殊说明:如果在定义局部变量时不赋初值的话,则对于静态局部变量来说编译时自动赋初值0(对数值型变量)或空字符(对字符变量)
四、register变量
为了提高效率,C语言允许将局部变量的值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register来声明。在日常工作学习中一般不会定义寄存器变量,这是因为一些变量需要多次参加计算而编译器却把这个变量转化成寄存器变量,从而程序员无法对寄存器变量的地址进行操作。register变量对于初学者来说仅作了解即可。
【C语言必经之路——第1节】自动变量(auto)外部变量(extern)静态变量(static)寄存器变量(register)