在函数之外定义的变量是全局变量,在函数内定义的变量是这个函数的局部变量。局部就是只能在当前函数内使用,而全局变量可以在任何一个函数中使用。
注意:一般而言,全局变量总是在所有函数之前定义,但如果某全局变量定义在两个函数之间,则定义处后面的函数可以使用,而其前面函数不能使用。
#include
<stdio.h>void
subFunc();int
gVar1 = 150; //全局变量1int
main(void
) {int
num = 250; //局部变量 printf("这是在main程序中:\n"); printf("gVar1 = [%d]\n", gVar1); printf("num = [%d]\n", num); // printf("gVar2 = [%s]\n", gVar2); // printf("buffer = [%s]\n", buffer); subFunc();return
0; } //这个就是只能在后面的subFun()中使用,不能用在main()中char
*gVar2 = "I am a global variable."; //全局变量2void
subFunc() {char
*buffer = "I am in subFunc."; //局部变量 printf("\n这是在subFunc程序中:\n"); printf("gVar1 = [%d]\n", gVar1); // printf("num = [%d]\n", num); printf("gVar2 = [%s]\n", gVar2); printf("buffer = [%s]\n", buffer);return
; }
有人说静态变量相当于全局变量,这句话其实不对。全局变量变成静态,就失去了静态的意义,因此,静态一般是加在局部变量上的。那么,究竟什么是静态的局部变量呢?静态变量随函数的定义而定义,如果已经存在就延用,但并不随函数的结束而消亡。在某一函数中定义的静态局部变量,不能在其它函数使用。
#include
<stdio.h>char
*getMemory(size_t); //申明后面要用的函数int
main(void
) { subFunc(); subFunc(); subFunc(); //静态局部变量仍是局部变量,在别的函数中不能使用。 //printf("m = %d \n", m);return
0; }void
subFunc() {static int
m = 0 ; //静态的局部变量int
n = 0 ; //局部变量 m++, n++; printf("m = %d , n = %d \n", m, n);return
; }
当很多人编写同一程序时,一般程序会被分割成几个文件。当几个人都定义了某一全局变量时,编译时不出错,Link时将出错。解决这个问题的办法:将其中一个定义原封不动,其余的定义前加上extend(即外部的定义)。
刚才所说是许多书上说的,小雅做了n次试验,证明上述编译时也不错,Link时也不错,也就是说extend完全是多余的。大概上面所说是几十年前的版本吧。事实上与extend同列在一起的还有auto、regist等变量修饰符。auto是区别B语言的,早就没用了,regist是将变量放到寄存器来运算,小雅认为基本没有这种需要。
/******************* * test1.c * *******************/#include
<stdio.h>void
subFunc();int
count; //全局变量int
main(void
) {int
i; subFunc(); printf("%2d\n",count);for
(i=0; i<count; i++) { printf("%2d ", i);if
(i % 10 == 9) { printf("\n"); } } printf("\n");return
0; }
/******************* * test2.c * *******************/#include
<stdlib.h> externint
count; //全局变量 extern不要也正确void
subFunc() { count = rand();return
; }
拆成多个文件,多次定义全局变量时要注意: