亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C 语言存储类完全解析:auto、extern、static、register

C 语言存储类完全解析

深度剖析自动、外部、静态、寄存器四大存储类如何定义变量的作用域、生命周期与性能特征。

自动(局部)变量

块内声明的变量为自动变量,即局部变量。仅在该块内存在,块结束即销毁。

#include <stdio.h>
int main(void) {
    for (int i = 0; i < 5; ++i) {
        printf("C programming\n");
    }
    // 错误:i 不在当前作用域
    printf("%d", i);
    return 0;
}

运行报 undeclared identifier i 错误,因 i 仅在 for 循环块内声明。

int main() { int n1; } // n1 仅 main 可见
void func() { int n2; } // n2 仅 func 可见

n1 在 func() 不可见,n2 在 main() 不可见。

全局(外部)变量

所有函数外声明的变量为全局/外部变量。同一编译单元内任意函数均可访问。跨文件使用时,extern 关键字声明定义在别处。

示例:全局变量

#include <stdio.h>
void display();
int n = 5; // 全局变量
int main() {
    ++n;
    display();
    return 0;
}
void display() {
    ++n;
    printf("n = %d\n", n);
}

输出

n = 7

若 n 定义在 file1.c,file2.c 使用需在顶部加 extern int n; 避免编译错误。

寄存器变量

register 提示编译器将变量存 CPU 寄存器加速访问。现代编译器激进优化常使提示多余。仅在嵌入式系统性能分析确认瓶颈时使用。

静态变量

static 变量生命周期贯穿程序全过程。仅在程序启动时初始化一次,直到程序终止。

示例:静态变量

#include <stdio.h>
void display();
int main() {
    display();
    display();
}
void display() {
    static int c = 1;
    c += 5;
    printf("%d ", c);
}

输出

6 11

首次调用 c 初始化为 1,增至 6。二次调用 c 保留 6,增至 11 打印。

文件作用域 static 赋予内部链接性,对其他编译单元不可见——利于封装。

ISO C 标准保证 static 在所有函数调用间保持单一实例,对无全局污染的有状态操作至关重要。

C语言

  1. 精通C#变量与基础数据类型:完整指南
  2. 理解 C# 变量作用域:类级、方法级与块级详解
  3. C# static 关键字:静态变量、方法与类完全掌握
  4. C++ 类模板实战指南:编写灵活的类型无关代码
  5. C 语言变量、常量与字面量完全指南
  6. C++ 变量与数据类型全解析:int、double、char、string、bool 详细指南
  7. C 语言变量详解:类型、命名规则、定义声明与内存管理
  8. C 语言存储类详解:作用域、生命周期与四大类型实战
  9. 理解 C 语言作用域规则:局部、全局与形式变量
  10. C 语言指针实战:从入门到高级编程
  11. C 语言可变参数详解:stdarg.h 实战指南
  12. 理解 Java 变量类型:综合指南