从变量的生存范围(又称作用域)来分,可将变量分为全局变量(或称外部变量,因为其定义在函数外部)和局部变量;从变量的生存时间来分,可将变量分为静态存储static(程序整个运行时间都存在)和动态存储auto(调用函数时临时分配内存)两种类型,值得注意的是用static声明局部变量,表示该变量的生存时间为整个程序执行期间,用static声明全局变量,由于全局变量本就分配在静态存储区,程序执行期间不会消失,因此static声明就表示该变量的作用域仅限于变量所在的文件如a.c,对于其他b.c之类的文件不可使用该变量。
关于全局变量和局部变量的例子。
//函数求取一个10元素数组的最大值,最小值,平均值
#include<stdio.h>
float Max=0,Min=0; //全局变量首字母大写以作标识
float average(float array[],int n)
{
int i ;
float aver,sum=array[0]; //局部变量,只在avreage函数中有效
Max=Min=array[0];
for(i=1;i<n;i++)
{
if (array[i]>Max) Max=array[i]; //全局变量在该函数中有效
else if(array[i]<Min) Min=array[i];
sum+=array[i];
}
aver=sum/n;
return(aver);
}
int main()
{
float ave,score[10];
int i;
for(i=0;i<10;i++)
scanf("%f",&score[i]);
ave=average(score,10); //score是main函数的局部变量,只在main函数中有效,要进入average函数需通过参数传递
printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",Max,Min,ave); //全局变量在main函数中有效
getchar();
return 0;
}
关于用static声明局部变量的例子。
#include <stdio.h>
int fun()
{
int b=0; //只要不使用static声明,则变量都默认为auto型
static int c=0; // 也可写成static int c
b=b+1; //b是动态存储,每次fun退出b就释放
c=c+1; //c是static型,因此程序运行期间其一直存在,但是注意同时c又是局部变量,因此只能被fun使用,其他函数都不可使用c
return (b+c);
}
int main()
{
int i;
for (i=0;i<3;i++)
printf("%d\n",fun());
getchar();
return 0;
}
程序运行输出结果为2、3、4,这里要说明的两点是:
(1)对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值,以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值;而对自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
(2)如在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0或空字符(对字符变量而言);而对自动变量来说,如果不赋初值则它的值是一个不确定的值,这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的值是不确定的。
前面已经说过,由于全局变量本身就存储在静态存储区中,因此在整个程序运行期间其都是存在的,因此static声明不再表示该标量的生存时间,而是表示该变量只能在该变量所在文件如a.c中使用,不能在其他c文件中使用,下面是关于用static声明全局变量的例子。
file1.c
static int A; //全局变量一般首字母大写以作区别
int main()
{
...;
}
file2.c
extern int A;
int main()
{
...; //即便用extern声明,在file2.c中也不可使用A,因为其在file1.c中已声明为static
}
以上就是关于全局变量、局部变量、auto声明变量(auto一般省略)、static声明变量的介绍,以前总是感觉自己脑海里一锅粥,也不知是没想静下心来学还是自己确实太笨,总之关于这4种总结一下就是:全局变量和局部变量表明的是变量的作用范围,而auto和static表示的是变量的作用时间,有一点特殊的就是static作用于全局变量,表示该变量不能被其他文件引用,只能在本文件中使用,就是这么简单,终于理清了。
上面所介绍的是各种变量的作用范围,这里再介绍一下如何用extern扩展全局变量的作用范围。
1、在同一文件内用extern声明全局变量
全局变量的作用范围是从其定义处开始,到变量所处的.c文件的末尾结束,如果在定义之前想引用该全局变量,则应在引用之前用关键字extern作外部变量声明,表示该变量是一个已经定义的外部变量,有了此声明,就可从声明处起,合法使用该全局变量。
#include<stdio.h>
int main()
{
extern int A,B;
printf("%d",A>B?A:B);
getchar();
return 0;
}
int A=12,B=13;
2、在其他文件内用extern声明全局变量
如果在a.c中定义了全局变量A,现b.c和d.c等文件中也需要使用A,则不需也不能在b.c和d.c中再定义A,因为这样在进行程序链接时会出现重复定义,正确的做法应该是在b.c和d.c中都用extern int A来扩展A的作用范围。
本文参考了谭浩强的c语言教程。