- C 编程教程
- C - 首页
- C 语言基础
- C - 概述
- C - 特性
- C - 历史
- C - 环境设置
- C - 程序结构
- C - Hello World
- C - 编译过程
- C - 注释
- C - 词法单元
- C - 关键字
- C - 标识符
- C - 用户输入
- C - 基本语法
- C - 数据类型
- C - 变量
- C - 整数提升
- C - 类型转换
- C - 类型强制转换
- C - 布尔值
- C 语言中的常量和字面量
- C - 常量
- C - 字面量
- C - 转义序列
- C - 格式说明符
- C 语言中的运算符
- C - 运算符
- C - 算术运算符
- C - 关系运算符
- C - 逻辑运算符
- C - 位运算符
- C - 赋值运算符
- C - 一元运算符
- C - 自增和自减运算符
- C - 三元运算符
- C - sizeof 运算符
- C - 运算符优先级
- C - 其他运算符
- C 语言中的决策
- C - 决策
- C - if 语句
- C - if...else 语句
- C - 嵌套 if 语句
- C - switch 语句
- C - 嵌套 switch 语句
- C 语言中的循环
- C - 循环
- C - while 循环
- C - for 循环
- C - do...while 循环
- C - 嵌套循环
- C - 无限循环
- C - break 语句
- C - continue 语句
- C - goto 语句
- C 语言中的函数
- C - 函数
- C - 主函数
- C - 按值调用函数
- C - 按引用调用函数
- C - 嵌套函数
- C - 可变参数函数
- C - 用户定义函数
- C - 回调函数
- C - 返回语句
- C - 递归
- C 语言中的作用域规则
- C - 作用域规则
- C - 静态变量
- C - 全局变量
- C 语言中的数组
- C - 数组
- C - 数组的特性
- C - 多维数组
- C - 将数组传递给函数
- C - 从函数返回数组
- C - 可变长数组
- C 语言中的指针
- C - 指针
- C - 指针和数组
- C - 指针的应用
- C - 指针运算
- C - 指针数组
- C - 指针到指针
- C - 将指针传递给函数
- C - 从函数返回指针
- C - 函数指针
- C - 指向数组的指针
- C - 指向结构体的指针
- C - 指针链
- C - 指针与数组
- C - 字符指针和函数
- C - 空指针
- C - void 指针
- C - 悬空指针
- C - 解引用指针
- C - 近、远和巨型指针
- C - 指针数组的初始化
- C - 指针与多维数组
- C 语言中的字符串
- C - 字符串
- C - 字符串数组
- C - 特殊字符
- C 语言中的结构体和联合体
- C - 结构体
- C - 结构体和函数
- C - 结构体数组
- C - 自引用结构体
- C - 查找表
- C - 点 (.) 运算符
- C - 枚举 (或 enum)
- C - 结构体填充和打包
- C - 嵌套结构体
- C - 匿名结构体和联合体
- C - 联合体
- C - 位域
- C - Typedef
- C 语言中的文件处理
- C - 输入 & 输出
- C - 文件 I/O (文件处理)
- C 预处理器
- C - 预处理器
- C - 编译指示
- C - 预处理器运算符
- C - 宏
- C - 头文件
- C 语言中的内存管理
- C - 内存管理
- C - 内存地址
- C - 存储类
- 其他主题
- C - 错误处理
- C - 可变参数
- C - 命令执行
- C - 数学函数
- C - static 关键字
- C - 随机数生成
- C - 命令行参数
- C 编程资源
- C - 问题 & 答案
- C - 快速指南
- C - 速查表
- C - 有用资源
- C - 讨论
C 语言中的存储类
C 存储类定义了 C 程序中变量和/或函数的作用域(可见性)和生命周期。它们位于要修改的类型之前。
在 C 程序中,我们有四种不同的存储类 -
- auto
- register
- static
- extern
auto 存储类
auto 是在函数或代码块内部声明的所有变量的默认存储类。可选的关键字“auto”可用于定义局部变量。
auto 变量的作用域和生命周期在其声明的同一代码块内。
auto 存储类的示例
以下代码语句演示了自动 (auto) 变量的声明 -
{ int mount; auto int month; }
上面的示例在同一个存储类中定义了两个变量。'auto' 只能在函数内部使用,即局部变量。
register 存储类
register 存储类用于定义应存储在寄存器而不是 RAM 中的局部变量。这意味着变量的最大大小等于寄存器大小(通常是一个字),并且不能对其应用一元“&”运算符(因为它没有内存位置)。
register 应仅用于需要快速访问的变量,例如计数器。还应注意,定义“register”并不意味着变量将存储在寄存器中。这意味着它可能会存储在寄存器中,具体取决于硬件和实现限制。
register 存储类的示例
以下代码语句演示了寄存器变量的声明 -
{ register int miles; }
static 存储类
static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不是在每次进入和退出作用域时创建和销毁它。因此,使局部变量成为静态变量允许它们在函数调用之间保持其值。
static 修饰符也可以应用于全局变量。这样做会导致该变量的作用域限制在其声明的文件中。
在 C 编程中,当在全局变量上使用static时,它会导致其类的所有对象共享该成员的一个副本。
static 存储类的示例
以下示例演示了在 C 程序中使用 static 存储类 -
#include <stdio.h> /* function declaration */ void func(void); static int count = 5; /* global variable */ main(){ while(count--) { func(); } return 0; } /* function definition */ void func(void) { static int i = 5; /* local static variable */ i++; printf("i is %d and count is %d\n", i, count); }
输出
当编译并执行上述代码时,它会产生以下结果 -
i is 6 and count is 4 i is 7 and count is 3 i is 8 and count is 2 i is 9 and count is 1 i is 10 and count is 0
extern 存储类
extern 存储类用于提供对所有程序文件可见的全局变量的引用。当使用“extern”时,变量不能初始化,但它会将变量名称指向之前定义的存储位置。
当您有多个文件并且您定义了一个全局变量或函数,该变量或函数也将在其他文件中使用时,则将在另一个文件中使用extern来提供已定义变量或函数的引用。为了理解,extern用于在另一个文件中声明全局变量或函数。
extern 修饰符最常用于两个或多个文件共享相同的全局变量或函数,如下所述。
extern 存储类的示例
extern 存储类的示例可能包含两个或多个文件。以下是一个演示在 C 语言中使用 extern 存储类的示例 -
第一个文件:main.c
#include <stdio.h> int count; extern void write_extern(); main(){ count = 5; write_extern(); }
第二个文件:support.c
#include <stdio.h> extern int count; void write_extern(void) { printf("Count is %d\n", count); }
在这里,extern用于在第二个文件中声明count,而它在第一个文件(main.c)中定义。现在,编译这两个文件,如下所示 -
$gcc main.c support.c
它将生成可执行程序a.out。当执行此程序时,它将产生以下输出 -
Count is 5
存储类的使用
存储类用于定义变量的作用域、可见性、生命周期和初始(默认)值。
存储类的总结
下表总结了具有不同存储类的变量的作用域、默认值和生命周期 -
存储类 | 名称 | 内存 | 作用域,默认值 | 生命周期 |
---|---|---|---|---|
auto | 自动 | 内部内存 | 局部作用域,垃圾值 | 在其声明的同一函数或代码块内。 |
register | 寄存器 | 寄存器 | 局部作用域,0 | 在其声明的同一函数或代码块内。 |
static | 静态 | 内部内存 | 局部作用域,0 | 在程序内,即只要程序正在运行。 |
extern | 外部 | 内部内存 | 全局作用域,0 | 在程序内,即只要程序正在运行。 |