📅  最后修改于: 2023-12-03 15:13:46.902000             🧑  作者: Mango
在 C 语言中,存储类和类型限定符用于描述变量的存储位置、作用域和生命周期等属性。
C 语言提供了 4 种存储类:auto、register、static 和 extern。
auto 存储类:当一个变量被定义为 auto 类型时,它的生命周期为所在函数的生命周期。auto 存储类是默认的存储类,可以省略。
register 存储类:当一个变量被定义为 register 类型时,它会尽可能地存储在 CPU 的寄存器中,以提高访问速度。
static 存储类:当一个变量被定义为 static 类型时,它的生命周期为整个程序的生命周期。它的作用域只限于定义它的文件内部。如果在函数内部使用 static 关键字定义一个局部变量,它的值会在函数调用结束后保持不变。
extern 存储类:当一个变量被定义为 extern 类型时,它的作用域为整个程序的生命周期。它的存储位置并不是在定义它的文件中,而是在其他文件中。在定义 extern 变量时并不会分配存储空间,而是表示该变量是在其他文件中已经定义过的。
C 语言提供了两种类型限定符:const 和 volatile。
const 类型限定符:当一个变量被定义为 const 类型时,它的值不能被修改。常常用于修饰函数参数,防止函数在内部修改参数的值。
volatile 类型限定符:当一个变量被定义为 volatile 类型时,它的值可能随时被修改。常常用于修饰硬件设备的相关变量,保证它们的值能够及时更新。
以下是一些例子:
// auto 存储类的使用
int main() {
auto int i = 10; // 等价于 int i = 10;
return 0;
}
// register 存储类的使用
int main() {
register int i = 10;
return 0;
}
// static 存储类的使用
int counter() {
static int i = 0;
i++;
return i;
}
int main() {
printf("%d\n", counter()); // 输出 1
printf("%d\n", counter()); // 输出 2
printf("%d\n", counter()); // 输出 3
return 0;
}
// extern 存储类的使用
// 在其他文件中定义 global_variable
extern int global_variable;
int main() {
printf("%d\n", global_variable);
return 0;
}
// const 类型限定符的使用
int sum(const int a, const int b) {
// a = 2; 错误,不能修改 a 的值
// b = 3; 错误,不能修改 b 的值
return a + b;
}
// volatile 类型限定符的使用
volatile int* addr = (volatile int*) 0x12345678;
int main() {
int val = *addr; // 从硬件地址读取值
*addr = 0x56789ABC; // 修改硬件地址中的值
return 0;
}