重回C语言之老兵重装上阵(三)C语言储存类
C 语言储存类(Storage Class)
在 C 语言中,储存类用于定义变量的作用域、生命周期、链接性等特性。储存类指定了变量的存储方式、可见性以及存活的时间。C 语言中有五种主要的储存类,它们分别是:auto
、register
、static
、extern
和 typedef
。
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 | 局部/全局 | 程序运行期间有效 | 为类型创建别名 |