本节重点讲述存储类别关键字及其使用,如果想详细了解关键字的同学点击下方链接进行跳转
1-1 C语言 - 关键字及其使用(数据类型)-CSDN博客
1-3 C语言 - 控制语句的使用注意事项(这些绝对是您经常出错的地方)-CSDN博客
目录
1. auto
:自动变量
auto
是C语言中的默认存储类,用于局部变量。其生命周期是从定义开始到所在块结束,作用域仅限于定义它的块内部。
- 概述:
auto
关键字用于声明自动变量,默认情况下,所有局部变量都是自动变量。 - 特性:
- 作用域:局部,即声明它们的函数或块。
- 存储周期:自动,函数或块结束时自动销毁。
- 默认值:未初始化时,值是未定义的。
- 关键点:通常不显式使用
auto
关键字,因为它是局部变量的默认存储类别。
void function() {
auto int a = 5; // 等同于 int a = 5;
}
2. register
:寄存器变量
register
提示编译器尽量将变量存储在CPU寄存器中,以提高访问速度。并不是所有变量都能存储在寄存器中,这取决于硬件和编译器的实现。通常只能对少量局部变量使用 register
。
- 概述:
register
关键字提示编译器将变量存储在 CPU 的寄存器中,而不是内存中,以提高访问速度。 - 特性:
- 作用域:局部。
- 存储周期:自动。
- 默认值:未初始化时,值是未定义的。
- 关键点:
- 编译器可能会忽略
register
提示,具体实现取决于编译器。 - 寄存器变量不能取地址,即不能使用
&
运算符。
- 编译器可能会忽略
void function() {
register int count = 0;
for (count = 0; count < 100; count++) {
// 快速访问 count
}
}
3. static
:静态变量
static
关键字用于定义静态局部变量、静态全局变量和静态函数。静态局部变量的生命周期是整个程序运行期间,但作用域仅限于定义它的块内部;静态全局变量和静态函数只能在定义它们的文件中可见。
-
概述:
static
关键字用于声明静态变量,具有持久存储周期,即在整个程序执行期间保留其值。 -
特性:
- 局部静态变量:
- 作用域:局部,但其值在函数调用之间保持不变。
- 存储周期:静态,即整个程序运行期间。
- 默认值:未显式初始化时,默认初始化为零。
void function() { static int count = 0; // 初始化只进行一次 count++; printf("%d\n", count); // 每次调用函数,count 都会累加 }
- 全局静态变量:
- 作用域:当前文件。
- 存储周期:静态。
- 默认值:未显式初始化时,默认初始化为零。
- 关键点:限制变量的作用域,仅在定义它的文件中可见,避免命名冲突。
- 局部静态变量:
static int Count = 0; // 仅在当前文件中可见
4. extern
:外部变量
extern
用于声明一个在其他文件中定义的全局变量或函数,使其可以在本文件中使用。extern
本身不定义变量,只是引用外部定义的变量。
- 概述:
extern
关键字用于声明外部变量,即在其他文件中定义的全局变量。 - 特性:
- 作用域:全局,但实际定义在其他文件。
- 存储周期:静态。
- 默认值:由实际定义的文件中的初始值决定。
- 关键点:用于跨文件共享变量。
// 在 file1.c 中定义全局变量
int count = 10;
// 在 file2.c 中引用全局变量
extern int count;
void function() {
printf("%d\n", count); // 使用 file1.c 中定义的 count
}
5. 代码示例
#include <stdio.h>
// `extern` 关键字的示例
extern int globalVar= 0; // 全局变量的声明
// 函数声明
void func1();
void func2();
void staticExample();
int main() {
// `auto` 关键字的示例
auto int autoVar = 1; // 自动变量(局部变量)
printf("Value of autoVar in main: %d\n", autoVar);
// 调用函数
func1();
func2();
// 调用 static 变量示例函数
staticExample();
staticExample();
return 0;
}
// 函数1
void func1() {
// `register` 关键字的示例
register int regVar = 2; // 寄存器变量
printf("Value of regVar in func1: %d\n", regVar);
// 修改并输出全局变量
globalVar = 5;
printf("Value of globalVar in func1: %d\n", globalVar);
}
// 函数2
void function2() {
// 局部变量
int localVar = 3;
printf("Value of localVar in func2: %d\n", localVar);
// 输出全局变量
printf("Value of globalVar in func2: %d\n", globalVar);
}
// static 变量示例函数
void staticExample() {
static int staticVar = 0; // 静态局部变量
staticVar++;
printf("Value of staticVar in staticExample: %d\n", staticVar);
}