变量存储类型

在C语言中,变量和函数有两种类型:
(1)数据类型:数据类型表示数据的含义,取值范围和允许的操作;
(2)存储类型:存储类型表示数据的存储介质(内存或寄存器)、生存期和作用域。

静态存储方式和动态存储方式

内存中供用户使用的存储空间可分为程序区、动态存储区、静态存储区。程序区用来存储程序代码,动态存储区和静态存储区用来存放数据。动态和静态存储区中的变量生存期是不同的。

1.静态存储方式
静态存储方式的变量存储在内存中的静态存储区,在编译时就分配了存储空间。在整个程序运行期间,该变量一直占有固定的存储空间,程序结束后,这部分空间才释放。这类变量的生存期是整个程序。静态局部变量和全局变量都存储在静态存储区中。

2.动态存储方式
动态存储方式的变量存储在内存中的动态存储区,在函数运行过程中,只有变量所在函数被调用时,编译系统才临时为该变量分配一段存储单元。函数调用结束后,所占空间被释放,变量值消失。该类变量的生存期仅在函数调用期间。

C语言中有五种存储类型的变量:自动局部变量、静态局部变量、寄存器变量、静态全局变量和外部变量。

1.静态局部变量
用关键字static定义的局部变量是静态局部变量,它放置在内存中的静态存储区中,所占用的存储单元不释放直至整个程序运行结束。所以静态局部变量在函数调用结束后任保持原值。在下一次函数调用时,该变量的值就是上一次函数调用结束时保存的值。

静态局部变量的初始化只在编译时进行一次,程序运行过程中不再重新进行初始化。只有程序结束并再次运行程序时,静态局部变量才重新被赋初始值。

静态局部变量特点
(1)静态局部变量属于静态存储类别,是在静态存储区分配存储单元。
(2)静态局部变量与全局变量一样,均只在编译时赋值一次。以后每次调用时不会重新赋初值,而是使用上次函数调用结束时保留下来的值。
(3)静态局部变量定义时如果没有赋初值,系统编译时会自动给其赋初值,重新进行初始化。
(4)虽然静态局部变量在函数调用结束后依然存在,但它们仅能为定义它们的函数所使用,其它函数不能使用。

void func(){
    static int a = 2;   //静态局部变量

    a+=2;
    printf("func:a=%d", a);
}

int main(void){
    static int a;    //静态局部变量,初始化为0

    func();
    a+=8;
    printf("main:a=%d", a);

    return 0;
}
执行结果:  func:a=4     main:a=8

2.静态全局变量
用关键字static定义的全局变量是静态全局变量,当需要把全局变量的作用域限定本文件之内,可以在定义全局变量时用关键字static来限定,称为静态全局变量。静态全局变量禁止在其它文件中访问。静态全局变量的声明和静态局部变量的生存期相同,都是整个程序的运行全程。

static int a = 4;   //静态全局变量

int main(void){
    printf("%d", a);
    return 0;
}
执行结果:4

3.非静态全局变量
没有用关键字static来限定的全局变量可以在其它文件中访问,称为非静态全局变量。

但要在其它文件中对它访问,还必须在其它文件的访问语句之前,用外部变量声明语句对已定义过的非静态全局变量进行外部引用声明。已经用外部变量声明语句过的变量称为外部变量。

外部变量声明:

int a = 4;  //非静态全局变量

int main(void){
    extern int a;  //外部引用申明
    printf("%d", a);
    return 0;
}
执行结果:4

4.自动变量
函数中的局部变量,不用static声明的即为自动变量,自动变量存储在动态存储区中。函数中的形参和函数中的定义的变量都属于自动变量。

不加关键字static的局部变量都属于自动变量,可以使用auto作自动类型说明。

auto int a;     //等价于int a;
auto float b;   //等价于float b;

自动变量特点:
复合语句中声明的变量及函数中的形参变量均属于自动局部变量。
全局变量不能是自动变量。
若不对自动变量赋初值,则其值时随机的。

5.寄存器变量
有些程序需要多次访问内存中的变量,这使得程序的执行效率大大降低,而寄存器的访问速度要远远快于内存中数据的访问速度,为此,c语言设置了一中存储类型,直接分配在CPU的存储器中,这种变量即为存储器变量。

寄存器变量声明

register int a;

寄存器变量说明:
(1)寄存器是与硬件密切相关的,不同类型的计算机,寄存器的数目是不同的,通常为2个或3个。对于一个函数中说明的多于2到3个寄存器变量,C编译系统会自动地将寄存器变量变为自动类型变量。由于受硬件寄存器长度的限制,所以寄存器变量只能是char、int、short或指针型。
(2)寄存器变量的作用域和生命周期与自动变量是一样的,因此,只有自动类型局部变量可以声明为寄存器变量。
(3)寄存器变量的分配方式是动态的,静态变量不能声明为寄存器变量。

参考书籍:《C语言程序设计教程》王曙燕著

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值