C系列: 全局变量与静态变量的区别
要讲清静态变量与全局变量的区别,要从四个方面:一为修饰符,二为存储地址,三为生命周期,四为外部可访问性。修饰符:全局变量在源文件的函数外部声明(不含extern),但若其它源文件要调用这个变量,就需要通过extern关键字来引用一下。静态变量用static来修饰;
存储地址:两者都是存储在静态存储区,非堆栈上,它们与局部变量的存储分开;
生命周期:两者都是在程序编译时或程序装入时由系统自动分配的,程序结束时消亡;
外部可访问性:全局变量在整个程序的任何地方均可访问,而静态变量相当于面向对象中的私有变量,它的可访问性只限定于声明它的那个源文件,即作用域仅局限于本文件(静态函数也一样);
由于它们都是由系统分配的存储空间,所以它们的存储地址是固定的,但值是可变的。
静态变量的声明与调用
static int fun = 6;void function_static1111(int i) {printf("%d\t", i);i += 10; }void function_static2222(int i) {printf("%d\t", i);}int main(void) {function_static1111(1);function_static1111(2);function_static2222(4);function_static2222(5);printf("%d\n", fun); /*特立独行、不受前方干扰,老夫佩服*/fun = fun + 100; /*给它加100,看它还不心动*/printf("%d\n", fun); /*终于变了,看来只要条件满足,也不是没有可能*/}/*Result:1 2 4 5 6 106*/
全局变量的声明与调用
/* * fileA.c */int print = 100; /*声明全局变量并初始化,注意:不带extern修饰符*/void printmessage() {printf("fileA.c printmessage\n");}
/* * fileB.c */void changePrint(int i) {extern int print;print = print * 10;printf("After Change print = %d\n", print);}void ghellops() {extern int print;/*用extern修饰符来引用全局变量,默认值为100*/ printf("Default : print = %d\n", print); /*打印默认值*/print = 2; /*对全局变量重新赋值*/print = print + 1; /*对全局变量做+1操作*/printf("After Change : print = %d\n", print);}/*Default : print = 100After Change : print = 3*/
后记:TNND,有的资料书害死人了,很不负责任,竞敢说C中用extern来声明全局变量,若不是老夫亲自验证,我还真相信呐。看来我的参考书有问题,很多语句模棱两可,翻译得很粗糙,害死我了http://www.agoit.com/images/smiles/icon_eek.gif 。BTW:谁有比较好的C入门资料?有的话就PM我,感激不尽http://www.agoit.com/images/smiles/icon_smile.gif 。
页:
[1]