当前位置: 首页 > article >正文

重回C语言之老兵重装上阵(三)C语言储存类

C 语言储存类(Storage Class)

在 C 语言中,储存类用于定义变量的作用域、生命周期、链接性等特性。储存类指定了变量的存储方式、可见性以及存活的时间。C 语言中有五种主要的储存类,它们分别是:autoregisterstaticexterntypedef

1. auto 储存类

  • 默认储存类auto 是默认的储存类,局部变量默认都是 auto 类型,因此可以省略不写
  • 作用域:局部变量。
  • 生命周期:在每次函数调用时分配,在函数调用结束时销毁。
  • 特点auto 变量存储在栈上。现代编译器通常会忽略 auto 关键字,因为它是默认行为。
  • 注意:在全局使用auto会报错error: file-scope declaration of 'xxx' specifies 'auto'
void func() {
    auto int x = 10;  // 等同于 int x = 10;
}

2. register 储存类

  • 作用域:局部变量。
  • 生命周期:在函数调用期间有效。
  • 特点register 变量存储在寄存器中(如果有可用寄存器),这使得对该变量的访问更快。
    • 不保证变量一定存储在寄存器中,编译器会根据情况进行优化。
    • 不能对 register 变量取地址(即不能使用 &)。
  • 使用场景:用于频繁访问的局部变量。
void func() {
    register int counter = 0;
    // 变量 counter 可能存储在寄存器中
}

3. static 储存类

  • 作用域:局部或全局变量。
  • 生命周期:静态变量在程序的整个运行期间存在,直到程序结束。
  • 特点
    • 局部静态变量:局部变量在函数调用结束后不会被销毁,下次调用时会保留其上次的值。
    • 全局静态变量:全局变量如果声明为 static,则该变量的作用域仅限于当前文件,其他文件无法访问。
void func() {
    static int count = 0;
    count++;
    printf("%d\n", count);  // 每次调用会打印递增的值
}

static int globalVar = 100;  // 仅在当前文件内有效

4. extern 储存类

  • 作用域:外部变量。
  • 生命周期:外部变量在程序的整个运行期间有效。
  • 特点
    • extern 关键字用于声明在其他文件中定义的全局变量或函数。
    • extern 变量没有定义,它仅仅是一个声明,表示变量在其他地方定义。
    • 用于在多个文件之间共享变量或函数。
// file1.c
extern int globalVar;  // 声明外部变量

void func() {
    globalVar = 10;
}

// file2.c
int globalVar = 0;  // 定义全局变量

5. typedef 储存类

  • 作用域:局部或全局。
  • 生命周期:在程序运行期间有效。
  • 特点
    • typedef 用于定义新的数据类型别名,使代码更具可读性。
    • 它不直接影响变量的存储方式,仅仅是为现有类型创建别名。
typedef unsigned int uint;
typedef char* str;

uint age = 25;
str name = "Alice";

储存类的总结

储存类作用域生命周期典型用途
auto局部变量函数调用期间有效默认储存类,局部变量无需显式声明
register局部变量函数调用期间有效存储在寄存器中,优化速度
static局部/全局变量程序运行期间有效保持值,限制作用域(局部和全局)
extern外部变量程序运行期间有效跨文件共享变量或函数
typedef局部/全局程序运行期间有效为类型创建别名


http://www.kler.cn/a/502849.html

相关文章:

  • 【微服务】面试题 5、分布式系统理论:CAP 与 BASE 详解
  • 【大厂面试AI算法题中的知识点】方向涉及:ML/DL/CV/NLP/大数据...本篇介绍为什么self-attention可以堆叠多层,这有什么作用?
  • Cython全教程2 多种定义方式
  • 新版AndroidStudio通过系统快捷创建带BottomNavigationView的项目踩坑记录
  • MDX语言的函数实现
  • 关于Java数组操作函数
  • 【Uniapp-Vue3】@import导入css样式及scss变量用法与static目录
  • 数据结构:栈(Stack)和队列(Queue)—面试题(一)
  • 2、第一个GO 程序
  • Win32汇编学习笔记09.SEH和反调试
  • 数据结构(Java版)第七期:LinkedList与链表(二)
  • 3 生成器(Builder)模式
  • Java算法 数据结构 栈 队列 优先队列 比较器
  • C#中前台线程与后台线程的区别及设置方法
  • 《自动驾驶与机器人中的SLAM技术》ch8:基于 IESKF 的紧耦合 LIO 系统
  • 灌区闸门自动化控制系统-精准渠道量测水-灌区现代化建设
  • 相加交互效应函数发布—适用于逻辑回归、cox回归、glmm模型、gee模型
  • RabbitMQ 在 Spring Boot 项目中的深度应用与实战解析
  • Java异步任务
  • 2024 年 3 月青少年软编等考 C 语言二级真题解析
  • IP层之分片包的整合处理
  • 【优选算法篇】:模拟算法的力量--解决复杂问题的新视角
  • Frp工具配置内网穿透
  • 基于SpringBoot的中华诗词赏析文化交流平台
  • 组织切片配准(切割角度校正)
  • 【IDEA】配置篇