C基础辅导:CC++中Static的作用详述
在C语言中,static的字面意思很容易让我们误入歧途。其实它有三个作用。
(1)先介绍它的第一个也是最重要的一个:隐藏。
当我们同时编译多个文件时,所有不带static前缀的全局变量和函数都具有全局可见性。要理解这句话,我举个例子。我们要同时编译两个源文件,一个是a.c,一个是main.c
这里是A.C的内容
char A = ' A ';//全局变量
void msg()
{
printf(" Hello \ n ");
}
Examda提示:下面是main . c
int main(void)
{
extern char a;// extern变量必须在使用
printf("%c ",a)之前声明;
(void)msg();
返回0;
}
程序运行结果是:
A Hello
你可能会问:为什么在a.c中定义的全局变量A和函数msg可以在main.c中使用?如前所述,所有不带静态前缀的全局变量和函数都具有全局可见性,其他源文件也可以访问。在这个例子中,a是一个全局变量,msg是一个函数,它们都没有以static为前缀,所以它对另一个源文件main.c可见
如果添加了static,它将对其他源文件隐藏。比如在a和msg的定义前加上static,main.c就看不到了。这个特性可以用来在不同的文件中定义同名的函数和变量,而不用担心命名冲突。Static可以用作函数和变量的前缀。对于函数,静态只能隐藏,而对于变量,静态有以下两个作用。
(2)static的第二个作用是保持变量内容的持久性。存储在静态数据区的变量会在程序开始运行时被初始化,这也是第一次初始化。静态存储区存储的变量有两种:全局变量和静态变量,但与全局变量相比,静态可以控制变量的可见范围。说到底,静电还是用来隐藏的。虽然这种用法并不常见,但我还是举个例子吧。
# include
int fun(void){
static int count = 10;//实际上这个赋值语句从来没有执行过
return count-;
}
int count = 1;
int main(void)
{
printf(" global \ t \ t local static \ n ");
for(;count printf("%d\t\t%d\n ",count,fun());
返回0;
}
程序的运行结果是:
全局局部静态
1 10
2 9
3 8
4 7
5 6 5[其实全局变量也有这个属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有字节的默认值都是0x00,在某些情况下可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以把所有元素逐个设置为0,然后给几个不为0的元素赋值。如果定义为静态,则省略最初设置0的操作。比如你想用一个字符数组做字符串,你觉得每次都要在字符数组末尾加' [2] '太麻烦了。如果字符串被定义为static,这个麻烦就省了,因为它在那里是' [2] '。我们来做个小实验验证一下。
# include
int a;
int main(void)
{
int I;
静态字符串[10];
printf(" integer:% d;string: (begin)%s(end)",a,str);
返回0;
}
程序运行结果如下
整数:0;String: (begin)(end)
最后用一句话总结一下static的三大功能。首先,静态的主要功能是隐藏。其次,因为静态变量存储在静态存储区,所以具有持久性,默认值为0。
0条评论