存储类别

存储类别

1.作用域

​ 作用域描述程序中可访问标识符的区域。其主要有:块作用区域、函数作用域、函数原型作用域、文件作用域。

2.链接

​ C变量有3种链接属性:外部链接、内部链接、无链接。其中块作用域、函数作用域、函数原型作用域的变量都是无链接变量。

3.存储期

​ 作用域和链接描述了标识符的可见性。存储期描述了通过这些标识符访问的对象的生存期。C有4种存储期:静态存储期、线程存储期、自动存储期、动态分配存储期。

4.5种存储类别

存储类别存储期作用域链接声明方式
自动自动块内
寄存器自动块内,使用关键字register
静态外部链接静态文件外部所有函数外
静态内部链接静态文件内部所有函数外,使用关键字static
静态无链接静态块内,使用关键字static
//块中的变量
#include <stdio.h>

int main(void)
{
    int x = 30;//原始的x

    printf("x in outer block :%d at %p\n", x, &x);
    {
        int x = 77;
        printf("x in inner block:%d at %p\n", x, &x);
    }
    printf("x in outer block :%d at %p\n", x, &x);
    while (x++ < 33)//原始x
    {
        int x = 100;//新的x,隐藏了原始的x
        x++;
        printf("x in while loop:%d at %p\n", x, &x);
    }
    printf("x in outer block :%d at %p\n", x, &x);

    return 0;
}

程序输出:

x in outer block :30 at 000000000061fe08
x in inner block:77 at 000000000061fe0c 
x in outer block :30 at 000000000061fe08
x in while loop:101 at 000000000061fe0c 
x in while loop:101 at 000000000061fe0c 
x in while loop:101 at 000000000061fe0c 
x in outer block :34 at 000000000061fe08

以上程序表现了在不同块中的变量的作用以 “{}” 作为分界。

5.存储类别说明符

关键字说明
typedef与任何内存都无关,在绝大多数情况下,不能在声明中使用多个存储类别说明符,所以不能使用多个存储类别说明符作为typedef的一部分。
auto表明变量是自动存储期,只能用于块作用域的变量声明中。
register只用于块作用域的变量,把变量归为寄存器存储类别,请求最快速度访问该变量,同时也保护了变量的地址不被获取。
static说明创建的对象具有静态存储期,载入程序时创建对象,当程序结束时对象消失。块作用域的静态变量无链接;文件作用域的静态变量具有内部链接。
extern表明声明的变量定义在别处。若包含extern的声明具有文件作用域,则引用的变量必须具有外部链接。若包含extern的声明具有块作用域,则引用的变量可能具有外部链接或内部链接,取决于变量的定义式声明。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ryan菲特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值