static 关键字有三种用法
- static 修饰局部变量 - 静态局部变量
- static 修饰全局变量 - 静态全局变量
- static 修饰函数 - 静态函数
static 关键字的三种用法
- 1. static 修饰局部变量 - 静态局部变量
- 2. static 修饰全局变量 - 静态全局变量
- 3. static 修饰函数 - 静态函数
1. static 修饰局部变量 - 静态局部变量
static可使得局部变量出了自己的范围也不会销毁,本质上是改变了局部变量的生命周期,但其作用域还是局部的。
详细点说,就是有时我们希望函数中局部变量的值在函数调用结束后不销毁而继续保留原值,即希望其占用的存储单元不释放。在下一次再调用该函数时,该变量已有值(就是上一次函数调用结束时的值)。
这时就该指定该局部变量为“静态局部变量”,用关键字static 对其进行声明。
我们一起通过下面简单的例子来了解它的特点。
#include<stdio.h>
int fun(int a)
{
int b = 0;
static int c = 3;
b = b + 1;
c = c + 1;
return (a + b + c);
}
int main()
{
int a = 2, i;
for (i = 0; i < 3; i++)
printf("%d\n", fun(a));
return 0;
}
运行结果
7
8
9
前后三次调用fun函数,b、c的值变化如下表
解析:静态局部变量(c)是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。而对自动变量(b)赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值。相当于执行一次赋值语句。
另外,我们还要知道,
如果在定义局部变量时不给它赋初值,那么对静态局部变量来说,编译时自动赋初值0(对数值型变量),或者空字符’\0’ (对字符变量)。而对自动变量来说,其值是个不确定的值。
虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它。因为它是局部变量,只能被本函数引用,而不能被其他函数引用。
2. static 修饰全局变量 - 静态全局变量
全局变量本身是具有外部链接属性的,即全局变量的作用域是整个工程,但是如果用 static 修饰全局变量,就会使得全局变量失去外部链接属性,变成内部链接属性,即只能在自己的文件中使用,所以 static 修饰的全局变量时,只能在自己的 .c 文件中使用。
我们一起来看下面这个例子:
我们创建两个文件,add.c和test.c,此时项目可以运行。
输出
2000
但当我们一旦用static来修饰全局变量g_val时,就会报错。如下:
3. static 修饰函数 - 静态函数
函数默认是有外部链接属性的,但是被 static 修饰后,会使得函数失去外部链接属性,变成内部链接属性。所以 static 修饰的函数只能在自己所在的 .c 文件内部使用,不能在其他文件中使用。和 static 修饰全局变量 很像。
一起来看下面这个例子
当在函数Add前加一个static时,报错
以上就是我整理的C语言中static 关键字的三种用法。