变量的存储方式
变量分为静态存储方式和动态存储方式
静态存储方式是指在程序运行期间由系统分配固定的存储空间方式
动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式
C语言中每一个变量和函数都有两个属性:数据类型 和 数据的存储类别
存储类别指数据在内存中存储的方式(如静态存和动态存储和动态存储)
C的存储类别包括4种:
自动的(auto) , 静态的(static), 寄存器(register),外部的(extern)
// auto 变量 和 static变量 #include<stdio.h> int main() { int f(int); //函数声明 int a=2,i; for(i=0;i<3;i++) printf("%d\n",f(a)); //输出f(a)的值 return 0; } fun f(int a) { auto int b=0; //自动局部变量 static c=3; //静态局部变量 b=b+1; c=c+1; return (a+b+c); }
什么情况下需要局部静态变量呢?需要保留函数上一次调用结束时的值,例如求阶乘n!
// auto 变量 和 static变量 #include<stdio.h> int main() { int f(int); //函数声明 int a=2,i; for(i=0;i<3;i++) printf("%d\n",f(a)); //输出f(a)的值 return 0; } fun f(int a) { auto int b=0; //自动局部变量 static c=3; //静态局部变量 b=b+1; c=c+1; return (a+b+c); }
寄存器变量
如果一些变量使用频繁,为了提高执行效率,允许将局部变量放在CPU中寄存器中,寄存器的存取速度远高于内存的存取速度,因此这样做可以提高执行效率,这种变量叫寄存器变量
register int f; //定义f为寄存器变量
外部的变量
如果外部变量不在文件开头定义,其有效作用范围只限于定义处到文件结束,在定义点之前的函数不能引用该外部变量。
如果由于某种考虑,在定义点之前的函数需要引用该外部变量,则应该引用之前用extern对该变量做外部变量声明
表示把该外部变量的作用域扩展到此位置,有了此声明,就可以从"声明"处起,合法地使用该外部变量,例如:
调用函数,求三个整数中的大者。
#include<stdio.h> int main() { int max(); extern int A,B,C; printf("Please enter three integer numbers"); scanf("%d%d%d",&A,&B,&C); //输入3个整数给A,B,C printf("max is %d\n",max()); return 0; } int A,B,C; //定义外部变量A,B,C int max() { int m; m=A>B?A:B; if(C>m)m=C; return (m); //返回m的值 }
//文件 file1.c #include<stdio.h> int A; int main() { int power(int); int b=3,c,d,m; printf("enter the number a and its power m:\n"); scanf("%d,%d,",&A,&m); c=A*b; printf("%d*%d=%d\n",A,b,c); d=power(m); printf("%d ** %d=%d\n",A,m,d); return 0; } //文件 file2.c extern A; int power(int n) { int i,y=1; for(i=1;i<=n;i++) y*=A; return (y); }