全局变量 一般指在程序入口地址之前定义的数据(C语言源程序里面是在main函数之前定义,Windows程序是在WinMain函数之前定义的数据),全局变量一般不需要加任何关键字声明。直接在main函数之前定义int a;就可以了。要注意全局变量是在编译时分配存储单元的,所以如果你不对它初始化的话编译器会自动把它初始化为0,全局变量的作用域为整个程序,所以一个程序里面所有的子程序(函数)都能使用它。
局部变量 因为全局变量可以被一个程序的所有函数使用,所以为了防止程序里面一个函数专用的数据被其他函数有意或无意的修改,所以引入了局部变量,局部变量可以用auto关键字申明,但是一般都省略auto关键字,局部变量是在函数里面定义的,比如在主函数里面定义int a=0;在fun函数里面定义int b=0;局部变量是在程序执行的时候临时分配存储单元的,它存储在堆栈段中,每个函数开始执行前都会先算出这个函数里面有多少个局部变量,占多少个存储空间,然后增加堆栈段空间以容纳这些数据,因为是临时分配的存储空间,所以所有的局部变量都是未初始化的,它里面的数据是其他函数用过的垃圾数据,你必须要给局部变量赋初值。在函数结束后会释放堆栈段空间,也就是局部变量只在它所在的函数的生命周期内有效。当一个函数执行结束后这个函数内的全部局部变量就全部不能用了。
静态变量 因为局部变量的生命周期只在改局部变量所在的函数生命周期内有效,但是在很多程序内一个函数内的局部变量往往要保留,以便改函数下次调用时使用,所以就有了静态变量这个概念。静态变量与全局变量差不多,也是在编译时分配内存空间,并且自动初始化为0,静态变量的生命周期也是整个程序。但是与全局变量不同的是静态变量只有它所在的函数能够使用它,程序里面其他的函数是不能够访问它的。静态变量必须用static关键字申明。比如 static int a;
(1)可以肯定,全局变量 不是必须要加static修饰,那么加了static修饰是什么意思?
答:在全局变量前加static表示变量只能在该文件中被引用,而不能在其他文件中用extern关键字引用,例如:
a.c文件:
#define
int BASE = 100;
int main(){}
b.c文件:
#define
extern BASE; //在b.c文件中利用extern关键字引用了a.c中的BASE,但如果a.c中用static修饰BASE,那这里的引用就会报错
int main(){printf("%d\n",BASE);}
(2)auto修饰符的定义里有这么一句“进入包含变量声明的代码时,变量开始存在。当程序离开这个代码块时,自动变量消失了。它所占用的内存可用来做别的事情。”,从“当程序离开代码块时变量消失”、“内存可用来做别的事情”可以推出auto修饰的变量是存储在堆栈中的。而全局变量存储在静态存储区中,所以用auto决不能修饰全局变量(已经测试过,Linux下报错:文件作用域中 ‘apple’ 的声明指定了 ‘auto’)
x,y不是static?是auto?答案:不是auto类型
所以我觉得结论是不是这样:
修饰全局变量的存储类型只有static和extern或者不加修饰,auto不能用来修饰全局变量。
全局变量必须是static 类型
这句话是错的 static 类型全局变量是全局变量的其中一种形式