C 语言 - 存储类
C 语言存储类
存储类定义了变量的生命周期、可见性和内存位置。
C 语言中有四种主要的存储类说明符:
autostaticregisterextern
作用域和存储类的区别
作用域定义了变量可以在哪里使用,而存储类定义了变量持续多长时间以及存储在哪里。本章是 C 语言作用域章节 的延续。
auto
auto 关键字用于局部变量。它是函数内部声明的变量的默认属性,因此很少显式使用。
实例
int main() {
auto int x = 50; // 等同于:int x = 50;
printf("%d\n", x);
return 0;
}
static
static 关键字改变了变量或函数在生命周期和可见性方面的行为:
- 静态局部变量在函数调用之间保持其值。
- 静态全局变量/函数在其文件外部不可见。
实例
void count() {
static int myNum = 0; // 在调用之间保持其值
myNum++;
printf("num = %d\n", myNum);
}
int main() {
count();
count();
count();
return 0;
}
结果:
num = 1 num = 2 num = 3
尝试从示例中移除 static 关键字以查看区别。
register
register 关键字建议将变量存储在 CPU 寄存器中(以便更快地访问)。
您不能使用 & 获取寄存器变量的地址。
注意:register 关键字基本上已经过时了——现代编译器会自动选择最佳的变量保存在寄存器中,因此您通常不需要使用它。
实例
int main() {
register int counter = 0;
printf("Counter: %d\n", counter);
return 0;
}
extern
extern 关键字告诉编译器变量或函数是在另一个文件中定义的。
在处理多个源文件时,它经常被使用。
文件 1: main.c
#include <stdio.h>
extern int shared; // 在此声明,在另一个文件中定义
int main() {
printf("shared = %d\n", shared);
return 0;
}
文件 2: data.c
int shared = 50; // 变量的定义
一起编译这两个文件:
gcc main.c data.c -o program