C系列: 全局变量与静态变量的区别

要讲清静态变量与全局变量的区别,要从四个方面:一为修饰符,二为存储地址,三为生命周期,四为外部可访问性。
修饰符:全局变量在源文件的[b]函数外部声明(不含extern)[/b],但若其它源文件要调用这个变量,就需要[b]通过extern关键字[/b]来引用一下。静态变量用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来声明全局变量,若不是老夫亲自验证,我还真相信呐。看来我的参考书有问题,很多语句模棱两可,翻译得很粗糙,害死我了 :shock: 。[b]BTW:谁有比较好的C入门资料?有的话就PM我,感激不尽 :) [/b]。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值