static为静态变量,初始化语句仅执行一次,不初始化则默认为0,因为静态内存(堆)中所有字节位(不知道术语是啥,反正大概就是一个字节里储存的内容的意思吧)默认为0000 0000,声明的静态变量会在堆中开辟相应的内存,静态变量与栈中的动态变量所不同的是,静态变量不会因为函数的结束而被释放,这一点跟全局变量有相似之处。
静态变量若声明在所有函数之外,则该变量的作用域为当前文件,其他文件不可访问该变量(局部的共有变量);
若声明在函数中,该变量的作用域则为函数内,除该函数以外的函数不可访问该变量,且该变量不会因为函数的结束而被释放,当下一次重新执行该函数的时候会以上一次结束时所保留的值而继续使用,例:
int fun(){ static int i; //该语句只执行一次 printf(“%d\n”,i); i++; } int main(){ //i++; 若这样输入则会出错,因为没有对i进行声明,fun里的i只能给fun使用 fun(); //此时打印出来的值为0 fun(); //此时打印出的值为1 }
extern全局变量,当变量声明在函数之外的时候会定义为全局变量,所有文件都可以访问该变量并可以修改,但是只能在一个文件里初始化;
注意:extern int a;只是声明一个全局变量,如果所有文件都只使用extern int a;进行声明而没有初始化则会报错。一般会用int a;定义,定义之后默认值为0,其他文件引用时只需写上extern int a;(其他文件int a;的话部分编译器会自动加上extern,不会报错)即可,也可以extern a=0;这样来定义一个全局变量
static变量的名字不会跟别的文件的全局变量名引起冲突,但是同名的情况下,该文件内的函数会优先使用该函数内的静态变量,如:
文件1:
#include<stdio.h> static int a=2; extern int a; void sum(int x); int main(){ test(); //打印出的值为0 sum(3); printf("a=%d\n",a); //打印出的值为5 return 0; } void sum(int x){ a += x; }
文件2:
#include<stdio.h> int a=0; void test(){ printf("hello.c 's a= %d\n",a); }