`
justshare
  • 浏览: 103756 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

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 = 100
After Change : print = 3*/

后记:TNND,有的资料书害死人了,很不负责任,竞敢说C中用extern来声明全局变量,若不是老夫亲自验证,我还真相信呐。看来我的参考书有问题,很多语句模棱两可,翻译得很粗糙,害死我了BTW:谁有比较好的C入门资料?有的话就PM我,感激不尽
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics