中科大C语言程序设计
C语言程序设计 - 第5章 函数 * 变量的存储类型 自动变量auto 寄存器变量register 静态变量static 外部变量extern C语言程序设计 - 第5章 函数 * 自动(auto)变量 auto变量 局部变量,用auto关键字修饰 auto可以省略,是缺省的存储方式 自动分配和释放存储空间 举例 int foo(int x) { auto int a, b, c=6;/* 定义自动变量a,b,c */ float f, g=0.1;/* 定义自动变量f,g */ } C语言程序设计 - 第5章 函数 * 寄存器(register)变量 register变量 存放在CPU寄存器中,存取速度快 寄存器变量只能动态分配存储空间(寄存器) 只有自动变量和形参可以作为寄存器变量 举例 int foo(int x) { register int i;/* 定义寄存器变量i */ for(i=0; i<10000; i++).../* i用于循环变量 */ } C语言程序设计 - 第5章 函数 * 静态(static)局部变量 静态局部变量 局部变量,用static关键字修饰 静态局部变量为静态存储,整个程序运行期间都不释放,其值不会丢失 在函数调用结束后,静态局部变量虽仍然存在,但已经不在变量的作用域内,所以其他函数不能引用它 静态局部变量在编译时赋初值,且只赋一次 若不对静态局部变量赋初值,则初值为0 C语言程序设计 - 第5章 函数 * 静态局部变量举例 int f(int a) { int b=0; static int c=3; b++; c++; return a+b+c; } void main() { int x=2, i; for(i=0;i<3;i++) printf("%d\n",f(x)); } i 0 x 2 a 2 b 0 c 3 f(x) - 1 2 1 4 5 6 7 8 9 C语言程序设计 - 第5章 函数 * 用extern声明外部变量 非静态外部变量 没有用static声明的外部变量 可以用extern声明外部变量,以扩展外部变量的作用域 可以在一个文件内声明外部变量,以在外部变量定义之前就可以使用 可以在多文件程序中声明外部变量,以在其他文件中引用某个文件中定义的外部变量 外部变量的定义一般放在所有函数之前 C语言程序设计 - 第5章 函数 * 非静态外部变量举例 (1) int max(int x, int y) { return x>y?x:y; } void main() { extern A, B;/* extern声明外部变量 */ printf("%d", max(A, B)); } /* 在定义之前使用外部变量 */ int A=13, B=-8; /* 定义外部变量 */ C语言程序设计 - 第5章 函数 * 非静态外部变量举例 (2) /* file1.c */ /* 声明外部变量 */ extern A, B; void main() { int c; c=max(A, B); printf("%d", c); } /* file2.c */ /* 定义外部变量 */ int A=13, B=-8; int max(int x, int y) { int z; z=x>y?x:y; return z; } C语言程序设计 - 第5章 函数 * 用static声明外部变量 静态外部变量 限制外部变量只能被本文件引用 静态外部变量不能被其他文件引用 举例 /* file1.c */ static int A; main() { ... ... } /* file2.c */ extern int A; void foo(int n) { A = A * n; } ? 不能引用静态 外部变量A C语言程序设计 - 第5章 函数 * 变量的声明和定义 声明 (Declaration) 对变量的某些属性加以说明 定义 (Definition) 定义一个新的变量,并分配存储空间 定义有声明的功能,但声明不一定都是定义 举例 void main() { extern A; /* 声明而非定义,声明A为已定义外部变量 */ ... ... } int A; /* 定义A为整型外部变量 */ C语言程序设计 - 第5章 函数 * 从作用域角度分类 局部变量 自动变量(离开函数,值就消失) 寄存器变量