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

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

什么是 C 语言存储类?

存储类定义变量的作用域、存储位置、初始化方式、生命周期及可访问性。C 语言中每个变量除类型外,还隶属某个存储类,决定其在何处、如何被访问。

四大标准存储类:

auto 存储类

auto 变量(局部变量默认)仅存在于定义它们的代码块。块退出时销毁,未显式初始化则值不定。

int add(void) {
    int a = 13;
    auto int b = 48; // auto 可省略
    return a + b;
}

作用域演示:

#include <stdio.h>
int main(void) {
    auto int j = 1;
    {
        auto int j = 2;
        {
            auto int j = 3;
            printf("%d ", j); // 打印 3
        }
        printf("\t%d ", j); // 打印 2
    }
    printf("%d\n", j); // 打印 1
}

输出:3 2 1

extern 存储类

extern 关键字声明在另一编译单元定义的变量或函数,实现跨源文件数据共享。

/* main.c */
#include <stdio.h>
extern int i; // 声明
int main(void) {
    printf("value of the external integer is = %d\n", i);
    return 0;
}
/* original.c */
#include <stdio.h>
int i = 48; // 定义

编译链接:gcc main.c original.c -o program。运行 ./program 输出:

value of the external integer is = 48

static 存储类

static 变量在程序整个运行期间保持值。可作局部 static 或文件级 static。

/* 文件级 static */
static int counter = 7;
void next(void) {
    /* 局部 static */
    static int iteration = 13;
    iteration++;
    printf("iteration=%d and counter=%d\n", iteration, counter);
}
int main(void) {
    while (counter < 10) {
        next();
        counter++;
    }
    return 0;
}

输出:

iteration=14 and counter=7
iteration=15 and counter=8
iteration=16 and counter=9

register 存储类

频繁访问且适合放入 CPU 寄存器的变量可用 register。编译器若寄存器不足可忽略提示。

#include <stdio.h>
int main(void) {
    register int weight;
    /* 取地址会编译报错 */
    // int *ptr = &weight; // compilation error
    return 0;
}

编译报错:

error: address of register variable 'weight' requested

存储类对比表

存储类声明位置存储位置默认值作用域生命周期
auto函数/块内内存不定函数/块函数/块
register函数/块内CPU 寄存器不定函数/块函数/块
extern所有函数外内存零整个程序程序运行期
static (局部)函数/块内内存零函数/块程序运行期
static (全局)所有函数外内存零文件程序运行期

核心要点

C语言

  1. C# 类与对象:面向对象编程的基石
  2. C# static 关键字:静态变量、方法与类完全掌握
  3. 理解 C# 嵌套类:定义、访问与继承实战
  4. C++类与对象:面向对象编程实战指南
  5. C++ 友元函数与友元类:突破访问控制的利器
  6. C++ 类模板实战指南:编写灵活的类型无关代码
  7. C 语言存储类完全解析:auto、extern、static、register
  8. C 语言存储类详解:作用域、生命周期与四大类型实战
  9. C++存储类别全解析:auto/register/static/extern/mutable作用域与生命周期
  10. C++接口编程:抽象类与纯虚函数实现规范契约
  11. C# 程序结构解析:从 Hello World 看命名空间、类、Main 入口与编译运行
  12. C# 基础语法与面向对象核心:类、成员、实例化、标识符与关键字