📅  最后修改于: 2023-12-03 15:25:03.921000             🧑  作者: Mango
在程序开发中,存储类和变量作用域是非常重要的概念。存储类为程序员提供了一些灵活性,可以控制变量的内存分配和生命周期。而变量作用域则决定了变量在何时何处可见。
存储类包括 auto
、register
、static
和 extern
四种。它们分别控制变量的存储位置、生命周期和作用域。
auto
存储类用于声明自动变量,即函数内定义的变量。自动变量的生命周期与函数调用的开始和结束相同,函数返回时自动销毁。
void func() {
auto int x = 0;
printf("x = %d\n", x);
}
register
存储类用于声明寄存器变量,即变量存储在 CPU 寄存器中。寄存器变量的访问速度比其他变量要快,但是寄存器数量有限,编译器可能会忽略这个关键字。
register int x = 0;
static
存储类用于声明静态变量,即变量的生命周期与程序的运行时间相同,并且只在声明它的源文件中可见。静态变量的初始值为 0。
void func() {
static int x = 0;
x++;
printf("x = %d\n", x);
}
extern
存储类用于声明全局变量,即可以在程序的任何地方访问这个变量。全局变量的生命周期与程序的运行时间相同,但是需要在另一个文件中声明它,否则编译器会认为这是一个未定义的变量。
// a.c
int global = 0;
// b.c
extern int global;
变量作用域决定了变量在何时何处可见。C 语言中,有以下几种作用域:
块作用域变量指的是定义在代码块内部的变量。变量的作用域仅限于这个代码块,一旦代码块结束,这个变量就会被销毁。
void func() {
int x = 0;
if (x == 0) {
int y = 1;
printf("y = %d\n", y);
}
// y 已被销毁
}
函数作用域变量指的是定义在函数内部,但是在代码块之外的变量。变量的作用域仅限于函数内部。
void func() {
static int x = 0;
x++;
printf("x = %d\n", x);
}
文件作用域变量指的是定义在文件顶部的变量,这个变量对文件中的函数都可见。文件作用域变量的作用域从定义到文件结束。
// a.c
int global = 0;
void func() {
printf("global = %d\n", global);
}
全局作用域变量指的是定义在所有函数之外的变量,这个变量对整个程序都可见。全局作用域变量的作用域从定义到程序结束。
// a.c
int global = 0;
// b.c
extern int global;