要讲清静态变量与全局变量的区别,要从四个方面:一为修饰符,二为存储地址,三为生命周期,四为外部可访问性。
修饰符:全局变量在源文件的[b]函数外部声明(不含extern)[/b],但若其它源文件要调用这个变量,就需要[b]通过extern关键字[/b]来引用一下。静态变量用static来修饰;
存储地址:两者都是存储在静态存储区,非堆栈上,它们与局部变量的存储分开;
生命周期:两者都是在程序编译时或程序装入时由系统自动分配的,程序结束时消亡;
外部可访问性:全局变量在整个程序的任何地方均可访问,而静态变量相当于面向对象中的私有变量,它的可访问性只限定于声明它的那个源文件,即作用域仅局限于本文件(静态函数也一样);
由于它们都是由系统分配的存储空间,所以它们的存储地址是固定的,但值是可变的。
静态变量的声明与调用
全局变量的声明与调用
后记:TNND,有的资料书害死人了,很不负责任,竞敢说C中用extern来声明全局变量,若不是老夫亲自验证,我还真相信呐。看来我的参考书有问题,很多语句模棱两可,翻译得很粗糙,害死我了 :shock: 。[b]BTW:谁有比较好的C入门资料?有的话就PM我,感激不尽 :) [/b]。
修饰符:全局变量在源文件的[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]。