静态变量是指在内存中原地不动
使用static关键字在某个块内声明一个变量。
#include<stdio.h> #include<stdlib.h> void fun(void); int main(void) { for(int i=0;i<3;i++) fun(); return 0; } void fun(void) { int a = 1; // 每执行一次函数就会执行一次 static int b = 1; // 局部静态变量,只有在这个函数内才可以访问 // 静态变量和外部变量在程序载入内存时就执行完毕,所以上面的语句在调用函数时会跳过 // 声明发在这里是指只有fun函数能访问。 printf("a = %d, b = %d\n", a,b); b++; }
外部连接的静态变量具有文件作用域、外部链接和静态存储期,也成为外部存储类别。该类别变量称为外部变量。
在所有函数外面创建外部变量。可以在函数内部使用extern关键字显示声明使用一个外部变量。
当外部变量定义在另一个源码文件中时必须使用extern
#include<stdio.h> int ex_var = 10; // 外部变量, 定义式声明 // 外部变量如果未初始化会被自动初始化未0 // 自动变量即块中或函数头的局部变量未初始化情况下不一定为0 // 外部变量的初始化必须使用常量表达式,只要不是变长数组sizeof表达式也视为常量表达式。 // int x=2; // int y = 2*x; // 这一行会报错,x是变量不能用变量初始化外部变量。 void fun(void); void fun2(void); int main(void) { extern int ex_var; // 引用式声明,关键字extern表明该声明不是定义编译器要到别处查询定义 for(int i=0;i<3;i++) { fun(); fun2(); } return 0; } void fun(void) { printf("fun1: %d\n", ex_var); ex_var++; } void fun2(void) { // auto 关键字显示的声明变量是一个自动变量也就是非静态自动变量。 auto int ex_var = 20; printf("fun2: %d\n", ex_var); ex_var++; }
使用static关键字在函数外部定义变量。具有静态存储期、文件作用域和内部链接。只能由同一文件内的函数使用。
#include<stdio.h> static int intern_var = 10; // 使用static关键字 void fun(void); int main(void) { for(int i=0;i<3;i++) { fun(); } } void fun(void) { printf("%d\n", intern_var); intern_var++; }