auto
???? auto称为自动变量 如果函数不做其他说明的话 均为自动变量
static
???? static称为静态变量。根据变量的类型可以分为静态局部变量和静态全局变量。
?1. 静态局部变量
它与局部变量的区别在于: 在函数退出时, 这个变量始终存在, 但不能被其它函数使用, 当再次进入该函数时, 将保存上次的结果。其它与局部变量一样。
2. 静态全局变量
Turbo C2.0允许将大型程序分成若干独立模块文件分别编译, 然后将所有模块的目标文件连接在一起, 从而提高编译速度, 同时也便于软件的管理和维护。静态全局变量就是指只在定义它的源文件中可见而在其它源文件中不可见的变量。它与全局变量的区别是: 全局变量可以再说明为外部变量(extern), 被其它源文件使用, 而静态全局变量却不能再被说明为外部的, 即只能被所在的源文件使用。
extern
???? extern称为外部变量。为了使变量除了在定义它的源文件中可以使用外, 还要被其它文件使用。因此,必须将全程变量通知每一个程序模块文件, 此时可用extern来说明。extern只能调用全局变量,而不能调用静态全局变量。
eg.
文件1为file1.c????????????
?int i, j;/定义全程变量/???????????????????????????????????
?char c;??????????????????????
?void func1(int k);???????????????????????????????????????????
?main()????????????????????????
?{???????????????????????????????
?????? func1(20);/调用函数/???????
?????? func2();???????????????????
?????? .??????????????????????
?????? .?????????????????????????
?????? .??????????????????????????
? }
? func1(int k) /用户定义函数/
? {
?????? j=k100;
? }
??文件2为file2.c
extern int i, j;/说明将i, j从文件1中复制过来/
extern char c; /将c复制过来/
func2()???????? /用户定义函数/
{
? static float k;/定义静态变量/
? i=j
5/100;
? k=i/1.5;
.
.
.
}
eg.自动变量与静态变量
#include<stdio.h>
int pri()? /局部的/
{
??? int b=0;
??? b++;
??? return b;
}
int sta()?? /静态的/
{
??? static int a=0;
??? a++;
??? return a;
}
main()
{
??? int i,k,p;
??? for (i=1 ;i<6;i++){
??????? k=sta();
??? p=pri();
??? printf(“%d,%dn”,k,p);/*这时输出的k值依次是1 2 3 4 5 */
??? }
}
静态变量是用static声明的、它不可以再次赋值它的值是累加的。静态变量一旦定义,在它的作用域(就是从定义的一刻开始到最后一个}为止)中永远都有效,而且能够存储“记忆”上一次的数值,直到整个程序运行完毕。自动变量用完之后随即释放。所以上例中K、P两个值一个是自增的,一个是不变的。
register称为寄存器变量。它只能用于整型和字符型变量。register说明的变量被存储在CPU的寄存器中,而不是象普通的变量那样存储在内存中, 这样可以提高运算速度。一般编译器只允许同时定义两个寄存器变量,一旦超过两个, 编译程序会自动地将超过限制数目的寄存器变量当作非寄存器变量来处理。取地址运算符& 不能作用于寄存器变量。
注意点:
一.? 各变量的区别与特点
1.局部变量的作用域在函数内部,同时,在复合语句内部也可以定义,作用域为复合函数语句内部;
2.全局变量作用域为整个源文件,如果同一工程中的其他源文件需要引用,需要加extern进行外部变量声明;
3.局部变量和全局变量可以重名,在局部变量作用域内,局部变量屏蔽全局变量;
4.局部变量不加static,在函数或者复合语句执行完毕后,释放内存空间,加static,内存空间保留,再次执行该函数或者语句时,局部变量保存有上次执行后的数据;
5.全局变量加static,不可以被其他源文件使用extern进行外部声明。
二.? 全局变量的使用
全局变量占用内存空间大,变量值容易被修改,应尽量避免使用全局变量。