1、static修饰局部变量:
在局部静态变量前面加上关键字static,该局部变量便成了静态局部变量。静态局部变量有以下特点:
(1)该变量在全局数据区分配内存
(2)如果不显示初始化,那么将被隐式初始化为0
(3)它始终驻留在全局数据区,直到程序运行结束
(4)此变量在函数运行结束的时候没有被销毁还是存在的;退出一个块之后仍然存在的局部变量
2、static 修饰全局变量:
在全局变量前面加上关键字static,该全局变量变成了全局静态变量。
全局静态变量有以下特点:
(1)在全局数据区内分配内存
(2)如果没有初始化,其默认值为0
(3)该变量在本文件内从定义开始到文件结束可见,即只能在本文件内使用
3、static 修饰函数:
在函数的返回类型加上static关键字,函数即被定义成静态函数。
静态函数有以下特点:
(1) 静态函数只能在本源文件中使用
(2) 在文件作用域中声明的inline函数默认为static
说明:静态函数只是一个普通的全局函数,只不过受static限制,他只能在所在文件内使用,不能在其他文件内使用。
include <stdio.h>
static int a = 10; // 静态全局变量,只在本文件内可见
void func()
{
int i = 0;
static int j = 0; // j是静态局部变量,只会被定义一次,在程序结束前,该变量始终存在(函数结束之后他还是存在的,知道程序结束才消失)
i++;
j++;
printf ("i = %d, j = %d\n", i, j);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
func();
}
return 0;
}
这是运行结果
i 一直是等于1,因为我们知道的,主函数调用了一次子函数,执行完一次操作子函数就会 i 就是被销毁;
所以下次调用的时候重新定义初始值0,执行完之后等于1,退出子函数,i 又被销毁;
可是被static修饰的 j 就不一样了,他会一直存在的局部变量,除非整个程序结束他才会被销毁,所以他会在程序结束之前一直 ++