c语言:static问题

static声明外部变量时可防其他文件调用。但我今天看见说static定义局部变量方便其他单元引用。这是怎么回事?static声明外部变量与static定义局部变量有什么不同?望广大朋友不吝指教!谢谢!

一、静态全局变量
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量是静态存储方式, 静态全局变量也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。

二、静态局部变量
static声明的局部变量在调用结束后不消失而保留原值,即其占用存储但愿不释放,在下一次该函数调用时,该变量保留上一次函数调用结束时的值。
只被初始化一次且只能在局部使用。

float func1()
{
static float a = 0;
return a++;
}
float func2()
{
float a = 0;
return a++;
}
int main()
{
for( int i = 0; i < 10; i++ )
cout<< func1() << endl;
for( int j = 0; j < 10; j++ )
cout<< func2() << endl;
return 0;
}
打印结果:func1: 0 1 2 3 4 5 6 7 8 9
func2: 0 0 0 0 0 0 0 0 0 0
且 a只能在func()函数中使用。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-09-09
static变量最大的作用范围是一个文件,也就是你所说的可防其他文件调用,而你说的局部变量,无论是不是static ,都是只在他的作用域里有效,即模块内有效,虽然他的生存周期是从程序的开始到结束,但其他地方是访问不到的,而全局static变量,整个文件内部所有的代码都是可以访问的到的。定义局部或全局变量就是这一点不同而已。
如果有明白的请补充说明!
第2个回答  2019-12-21
大括号可以将代码分段去处理,第一个
{static
int
a=2;}大括号将a做为这个区域的一个局域变量,超出这个区域的a是无效的,故 printf("%d\n",a)的a变量是全局变量;
{static
int
a=2;
printf("%d\n",a);}这个括号将printf("%d\n",a)包含进去,所以打印的是该区域的变量a=2,
最后一个在同个代码块中是不允许定义相同的变量的,故出错~
第3个回答  2019-02-11
两种,全局变量和静态类型变量
,static,即在程序运行的过程中静态变量始终是占用一个存储空间。
静态变量只能在他的作用范围内使用,使用局部静态变量是为了在下次调用该函数时,能使用上次调用后得到的该变量的值。
(1)定义格式:
static
数据类型
内部变量表;
(2)存储特点
1)静态内部变量属于静态存储。在程序执行过程中,即使所在函数调用结束也不释放。换句话说,在程序执行期间,静态内部变量始终存在,但
其它函数是不能引用它们的。
2)定义但不初始化,则自动赋以"0"(整型和实型)或'\0'(字符型);且每次调用它们所在的函数时,不再重新赋初值,只是保留上次调用
结束时的值!
(3)何时使用静态内部变量
1)需要保留函数上一次调用结束时的值。
2)变量只被引用而不改变其值。
第4个回答  2019-09-09

A
声明为static将把变量存储在静态存储区(全局变量也存储在静态存储区)
B)
全局变量说明为static存储类,其作用域将被缩小到所在的文件
C)
静态变量,全局变量,还有整型数组在未赋初值时期初值为0
D)
二者还是有差别的
相似回答