多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# C 存储类别 > 原文: [https://www.programiz.com/c-programming/c-storage-class](https://www.programiz.com/c-programming/c-storage-class) #### 在本教程中,您将了解局部和全局变量的范围和生存期。 此外,您还将学习静态和寄存器变量。 C 编程中的每个变量都有两个属性:类型和存储类。 类型是指变量的数据类型。 并且,存储类确定变量的范围,可见性和生存期。 有四种类型的存储类别: 1. 自动 2. 外部 3. 静态 4. 寄存器 * * * ## 局部变量 在块内声明的变量是自动变量或局部变量。 局部变量仅存在于声明它的块内部。 让我们举个例子。 ```c #include <stdio.h> int main(void) { for (int i = 0; i < 5; ++i) { printf("C programming"); } // Error: i is not declared at this point printf("%d", i); return 0; } ``` 当您运行上述程序时,将显示错误未声明的标识符`i` 。 这是因为`i`在`for`循环块内声明。 在该块之外,未声明。 让我们再举一个例子。 ```c int main() { int n1; // n1 is a local variable to main() } void func() { int n2; // n2 is a local variable to func() } ``` 在以上示例中,`n1`对于`main()`是本地的,`n2`对于`func()`是本地的。 这意味着您无法访问`func()`内部的`n1`变量,因为它仅存在于`main()`内部。 同样,您无法访问`main()`中的`n2`变量,因为它仅存在于`func()`内部。 * * * ## 全局变量 在所有函数外部声明的变量称为外部或全局变量。 可以从程序内的任何函数访问它们。 * * * ### 示例 1:全局变量 ```c #include <stdio.h> void display(); int n = 5; // global variable int main() { ++n; display(); return 0; } void display() { ++n; printf("n = %d", n); } ``` **输出** ```c n = 7 ``` 假设在`file1`中声明了全局变量。 如果您尝试在另一个文件`file2`中使用该变量,则编译器会抱怨。 为了解决此问题,在`file2`中使用关键字`extern`表示在另一个文件中声明了外部变量。 * * * ## 寄存器变量 `register`关键字用于声明寄存器变量。 寄存器变量应该比局部变量快。 但是,现代编译器非常擅长代码优化,使用寄存器变量将使程序运行更快的机会非常少。 除非您在嵌入式系统上工作,在该系统上您知道如何为给定应用优化代码,否则将不使用寄存器变量。 * * * ## 静态变量 通过使用`static`关键字声明静态变量。 例如; ```c static int i; ``` 静态变量的值会一直保留到程序结束。 * * * ### 示例 2:静态变量 ```c #include <stdio.h> void display(); int main() { display(); display(); } void display() { static int c = 1; c += 5; printf("%d ",c); } ``` **输出** ```c 6 11 ``` 在第一个函数调用期间,`c`的值被初始化为 1。其值增加了 5。现在,`c`的值是 6,将其打印在屏幕上。 在第二个函数调用期间,`c`不会再次初始化为 1。 这是因为`c`是静态变量。`c`的值增加 5。现在,它的值将为 11,并打印在屏幕上。