C语言关键字之static
参考资料:http://topic.csdn.net/u/20101221/22/a4fdc6a1-23d0-4bdc-8bda-fe61f90ffdd7.html
http://blog.sina.com.cn/s/blog_4462f8560100lmzs.html
最近因为要在上课的时候上讲台做15分钟的演讲,在我犹豫着讲什么话题的时候,刚好在网上看到了一篇关于
C语言关键字的文章。我看了一下发现作者写得还不错,就一口气把它看完,这时候就想到了,关键字是C语言的一个重要的工具,但是有些有很容易被我们忽略,所以我就决定演讲主题就讲C语言的关键字中的static。
好现在进入我们的正题,其实static的作用范围可以有3个:静态全局变量,静态局部变量,静态函数
静态全局变量从名字就可以看得出,就是在全局变量的加上static 来修饰。
全局变量如果没有加上static的时候,全局变量自动的修饰符是extern,这样就可以被整个工程都可以访问到。但是加上了static之后,变量就只能被本文件访问到。这个可以防止了变量名的冲突。如果没有初始化的静态全局变量都后被赋值0。
在讲解局部变量之前呢,我们要先看看一个典型的c语言在内存的存储模型
一般我们在的函数中,如果是默认修饰符的局部变量,变量就会存储到函数的栈里面,这样的话函数的退出,变量就会从栈里被释放。如果加上static 修饰的话,那么静态局部变量的存储地方就发生了变化,静态局部变量是存储到静态存储区里面。静态存储区是属于程序的,只会随着程序的退出才会被释放。静态局部变量是在程序的开始就被生成的。并且不会随着函数的退出而被释放,只会在程序退出的时候才会被释放。而且每次函数用到静态局部变量都会从静态存储区里面读取静态变量的值。虽然存储地方变了但是局部变量的作用域还是在函数,并没有改变。下面的对比代码就最能解释这个了:
#include<stdio.h>
void count(int a)
{
int result=0;
result+=a;
a--;
printf("%d\n",result);
if(a==0) return;
else count(a);
}
int main(int argc,char *argv[])
{
count(2);
getchar();
return 0;
}
输出结果是:2
1
#include<stdio.h>
void count(int a)
{
static int result=0;
result+=a;
a--;
printf("%d\n",result);
if(a==0) return;
else count(a);
}
int main(int argc,char *argv[])
{
count(2);
getchar();
return 0;
}
输出结果是:2
3
有些人会说那你这个静态局部变量存储在这个静态存储区里面不就跟全局变量差不多,是不是也可以被其他的程序所利用啊?其实C语言给予了我们控制程序的最强大的工具,指针,如果我们可以拿到静态局部变量的指针,那么我们就可以在整个程序中利用它~
静态函数的最大作用就是把函数的作用范围限定在本文件中(就是.c文件),而不能被别的文件调用。