请看正文
C语言中的变量有哪些存储类型,你还记得吗?static老手都这样用。
1、先来回顾C语言变量
C语言中变量值的存储位置有两类:CPU的寄存器和内存。变量存储类型关系到其存储位置,除了register型存储在CPU寄存器中,C语言提供的其它三种存储类型(auto型、static型、extern型)的变量均存储在内存中。存储位置不同,决定了变量的生存期和作用域。
具体变量介绍请见作者的另一篇文章,名为《说一说C语言中的变量存储类型——“extern”》。
下面我们直接讲干货,static关键字用法。
2、Static关键字用法
C语言中,无论是变量还是函数都可以用static关键字来修饰。具体用法我们分别来看。
1)修饰函数
我们知道函数的声明(定义)也可以包括存储类型,但只有extern/static两种。当函数声明为extern,说明函数具有外部链接,其它文件可以调用此函数;当函数声明为static,说明函数是内部链接,即只能在定义函数的文件内部调用函数。当不指明函数存储类型,则默认该函数具有外部链接。
这种情况适用于多文件编程(大多数程序都是这样的)。当某个文件中定义的函数不希望被其它源文件调用,就可以把它声明为static,对其它文件来说该函数不可见。例如,你在file1.c文件中定义了多个函数,如果你不允许函数名为fun2的函数被其它文件的函数调用,只需要将其声明为static即可,这样fun2函数只允许被file1.c中的其它函数调用,其它源文件中的函数无法调用fun2,起到了隐藏的作用。
static int fun2(char c); //内部链接,对外不可见
2)修饰全局变量
我们知道,全局变量存储在静态存储区,但是它不是静态变量,它的作用范围从定义处到所在源文件末尾。但是它对其它源文件都是有效的,只需要通过extern声明一下即可,详见作者的另一篇文章《说一说C语言中的变量存储类型——“extern”》。
但是有些情况下,某些全局变量不想被同程序的其它源文件使用,那么我们就可以使用static关键字声明一下即可。例如,在file1.c中我们定义的整型全局变量g_a不想被其它源文件中函数使用,只需要在定义g_a时加上static关键字修饰。
static int g_a;
这样g_a对其它源文件比如file2.c是不可见的,当然,file2.c中也可以定义一个同名的静态全局变量,这是没有问题的。
3)修饰局部变量(静态局部变量)
我们知道,在C语言中,局部变量通常定义在函数内部,编译时不分配空间,只有函数调用运行阶段分配空间,局部变量存储在动态存储区,函数调用结束时所占用空间被收回。对于变量介绍,详见作者的另一篇文章《说一说C语言中的变量存储类型——“extern”》。
有时,根据程序需要,我们希望某个局部变量的值一直保持,且每次函数调用时(除第一次调用分配空间外)不再分配空间,直接读取上次的值。该怎么做呢?
很简单,只需要在定义局部变量时,用static修饰。例如,file1.c文件中funx函数定义了一个静态局部变量t,我们可以如下定义:
Int funx(void)
{
static int t;
其它语句
……
return t;
}
定义之后,t变成了一个静态局部变量,其存储在静态存储区,与全局变量存储区域相同。因此,在t被分配空间后,空间是固定的,其生存期直到程序运行结束,而不是所在函数调用结束。
static定义静态局部变量的另一个好处是,变量被分配空间后,默认初始化值为0。其原因就是静态局部变量存储在静态存储区,该区域内存中所有字节默认为0x00。
今天留个作业,“如果要在定义某静态全局变量位置之前使用它,该如何操作呢?”请大家留言回答,谢谢!
好了,关于static的用法今天就总结到这,如果大家有任何疑问请留言探讨。我是“C语言知识传播者”,志在瞄准C语言,挖掘和总结C语言的难点和痛点,给C语言编程爱好者和本领域从业人员提供参考,我会用心总结C语言知识的点点滴滴,您的关注是我持续创作的动力,请收藏本文、转发并点赞,希望得到您的持续关注,谢谢!
举报/反馈