来自中兴笔试题目:
static的用途?
1.隐藏:把变量的可见范围限制在编译单元中,使它成为一个内部连接;
2.静态存储:使得变量或对象的存储形式变成静态存储;
3.初始化为0
4.类中的static成员
(1)隐藏(即限定作用域):全局变量和函数
同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。
被staitc修饰的全局变量或函数都被编译器标记为仅在本文件中使用,由于编译器在编译过程中是以.c结尾的源文件为单位依次生成以.o结尾的目标文件,所以最后连接器在连接过程中将不允许被static修饰的变量或函数的地址对外链接。这样既可以防止全局变量或函数的重名问题,又可以防止由于无关的全局变量误操作引起的程序逻辑问题。因此static就限定了变量或函数的作用域。
我们要同时编译两个源文件,一个是a.c,另一个是main.c.
下面是a.c的内容
char a = 'A'; // global variable,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问
//所以,另外的源文件main.c是可见的。
void msg()
{
printf("Hello\n");
}
下面是main.c的内容
int main(void)
{
extern char a; // extern variable must be declared before use
printf("%c ", a);
(void)msg();
return 0;
}
程序的运行结果是:
A Hello
如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。
利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。
(2)static的第二个作用是保持变量内容的持久。局部变量
一般情况下,对于局部变量是存放在栈区的,并且局部变量的生命周期在该语句块执行结束时便结束了。
但是如果用static进行修饰的话,该变量便存放在静态数据区,其生命周期一直持续到整个程序执行结束。
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。
#include
int fun(void){
static int count = 10; // 事实上此赋值语句从来没有执行过
return count--;
}
int count = 1;
int main(void)
{
printf("global\t\tlocal static\n");
for(; count <= 10; ++count)
printf("%d\t\t%d\n", count, fun());
return 0;
}
程序的运行结果是:
global local static
1 10
2 9
3 8
4 7
5 6
6 5
7 4
8 3
9 2
10 1
(3)static的第三个作用是默认初始化为0.其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,可以减少程序员的工作量。
#include<stdio.h>
int a;
int main(void)
{
static char str[10];
printf("a: %d; str: %s", a, str);
return 0;
}
运行结果:
去掉static修饰后:
#include<stdio.h>
int a;
int main(void)
{
char str[10];//去掉static,str为随机值
printf("a: %d; str: %s", a, str);
return 0;
}
运行结果:
总结:首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0.
以上原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/database/384/12075884.shtml
(4)C++中的static
static进行修饰类的成员函数:
1.则表示该函数属于一个类而不是属于此类的任何特定对象;
2.只能访问静态成员函数和静态成员变量,不能访问非静态成员函数或者变量。
static修饰类的成员变量:
1.表示该变量为类以及其所有的对象所有。
二者共同点:在存储空间中都只存在一个副本; 可以通过类和对象去调用
详细出处参考:http://www.jb51.net/article/37336.htm