学习笔记---变量的类型

来源:互联网 发布:利他林 淘宝搜什么 编辑:程序博客网 时间:2024/06/05 00:11

变量的类型

程序对内存的使用:



变量的存储类别分为:


自动的(auto)

寄存器的(register)

外部的(extern)

静态的(static)


自动变量(auto variable)

例如:

int f(int a){    auto int b,c=3;//b和c为整型的自动变量}

存储位置:动态数据区


特性:在定义时自动分配存储空间,在作用域结束时自动释放空间


注:auto是局部变量默认的存储类别


寄存器变量(register variable)

例如:

int fac(int n){    register int i,f=1;    for(i=1;i<=n;i++)f=f*i;    return f;}

存储位置:寄存器(不在内存中)


特性:访问直接,调用快


注1:寄存器是CPU内部用于存储数据的原件,因为它离运算器最近,所以是计算机存储体系中访问最直接,速度最快的存储部件

注2:因为寄存器的存储大小和数量都有限,所以应当只将调用频繁的,重要的变量定义为寄存器变量(事实上,定义寄存器变量只是一种给系统对该变量存储位置建议并不能强制其将该变量存储于寄存器内,所以如果将太多变量定义为寄存器变量,最后可能会不起效果)

注3:一些编译系统会自动识别使用频繁的变量并将之存入寄存器。


外部变量(extern variable)

例如:

#include <stdio.h>#include <stdlib.h>int main(){    extern int a,b;//对全局变量a,b作提前引用声明    return 0;}int a=15,b=-7;//在main函数后面才定义全局变量

存储位置:无/静态数据区(这更像是一种对全局变量的提前调用声明


特性:可在某些全局变量的作用域之外对其进行调用(谨慎进行赋值操作



代码示例1:

#include <stdio.h>#include <stdlib.h>/*这个程序用来测试外部变量*/int max(int,int);int main(){    extern int a,b;//对全局变量a,b作提前引用声明    printf("%d\n",max(a,b));    return 0;}int a=15,b=-7;//在main函数后面才定义全局变量int max(int x,int y){    int z;    z=x>y?x:y;    return z;}
结果:


解析:

1.在int a,b;前加上extern,表示此处的a,b是全局变量中的a,b。

2.extern int的执行相当于变量的声明(类比于函数的声明),在声明时不会为a,b分配存储空间


代码示例2:

#include <stdio.h>#include <stdlib.h>/*这个程序用来测试外部变量*/int max(int,int);int main(){    extern int a,b;//对全局变量a,b作提前引用声明    a=5,b=7;//这里给a,b进行赋值    printf("%d\n",a+b);    printf("%d\n",max(a,b));    return 0;}int a=15,b=-7;//在main函数后面才定义全局变量int max(int x,int y){    int z;    z=x>y?x:y;    return z;}
结果:


解析:

在main中用extern声明了a,b为外部变量之后,a,b并没有被分配存储空间。而当执行到a=5,b=7;时,系统将为a,b分配存储空间并赋值。这时a,b相当于从外部变量变成了局部变量。所以调用时将采用局部变量a,b的值(即5和7)



静态变量(static variable)

例如:

int f(int a){    static int c=3;}

存储位置:
静态数据区(即使是局部变量,只要用static声明,也将存放在静态数据区。事实上,只有auto类型的变量会存放在动态数据区


特性:

1.当程序执行离开该变量的作用域,该变量的存储空间将不会被释放(直到程序执行结束)

2.如果该变量同时是局部变量,对其进行static声明并不会影响其作用域(在其作用域外依然不能对其进行调用)

3.原值在程序执行离开其作用域之后也不会消失,在程序执行下次再次进入其作用域时,该变量仍是上次调用时的值


代码示例:

#include <stdio.h>#include <stdlib.h>/*这个程序用于测试静态变量*/int f(int);int main(){    int a=2,i;    for(i=0;i<3;i++)    {        printf("%d ",f(a));//循环输出f(a)的值,验证静态变量的值是否存储在静态数据区    }    printf("\n");    return 0;}int f(int a){    auto int b=0;//自动的局部变量b    static int c=3;//静态的局部变量c    b++,c++;//c和b都自增1    return a+b+c;}
结果:

解析:

1.如上代码的测试,c的值在每次调用时都比上次大1,说明其上次调用后的值在函数返回后被保存下来了

2.利用静态变量的特性,我们能完成函数调用的计数或其他一些需要保留上次调用时的值的需求

3.静态局部变量的劣势可以参考全局变量,应当谨慎使用





0 0
原创粉丝点击