原文: https://www.programiz.com/c-programming/c-storage-class

在本教程中,您将了解局部和全局变量的范围和生存期。 此外,您还将学习静态和寄存器变量。

C 编程中的每个变量都有两个属性:类型和存储类。

类型是指变量的数据类型。 并且,存储类确定变量的范围,可见性和生存期。

有四种类型的存储类别:

  1. 自动
  2. 外部
  3. 静态
  4. 寄存器

局部变量

在块内声明的变量是自动变量或局部变量。 局部变量仅存在于声明它的块内部。

让我们举个例子。

  1. #include <stdio.h>
  2. int main(void) {
  3. for (int i = 0; i < 5; ++i) {
  4. printf("C programming");
  5. }
  6. // Error: i is not declared at this point
  7. printf("%d", i);
  8. return 0;
  9. }

当您运行上述程序时,将显示错误未声明的标识符i 。 这是因为ifor循环块内声明。 在该块之外,未声明。

让我们再举一个例子。

  1. int main() {
  2. int n1; // n1 is a local variable to main()
  3. }
  4. void func() {
  5. int n2; // n2 is a local variable to func()
  6. }

在以上示例中,n1对于main()是本地的,n2对于func()是本地的。

这意味着您无法访问func()内部的n1变量,因为它仅存在于main()内部。 同样,您无法访问main()中的n2变量,因为它仅存在于func()内部。


全局变量

在所有函数外部声明的变量称为外部或全局变量。 可以从程序内的任何函数访问它们。


示例 1:全局变量

  1. #include <stdio.h>
  2. void display();
  3. int n = 5; // global variable
  4. int main()
  5. {
  6. ++n;
  7. display();
  8. return 0;
  9. }
  10. void display()
  11. {
  12. ++n;
  13. printf("n = %d", n);
  14. }

输出

  1. n = 7

假设在file1中声明了全局变量。 如果您尝试在另一个文件file2中使用该变量,则编译器会抱怨。 为了解决此问题,在file2中使用关键字extern表示在另一个文件中声明了外部变量。


寄存器变量

register关键字用于声明寄存器变量。 寄存器变量应该比局部变量快。

但是,现代编译器非常擅长代码优化,使用寄存器变量将使程序运行更快的机会非常少。

除非您在嵌入式系统上工作,在该系统上您知道如何为给定应用优化代码,否则将不使用寄存器变量。


静态变量

通过使用static关键字声明静态变量。 例如;

  1. static int i;

静态变量的值会一直保留到程序结束。


示例 2:静态变量

  1. #include <stdio.h>
  2. void display();
  3. int main()
  4. {
  5. display();
  6. display();
  7. }
  8. void display()
  9. {
  10. static int c = 1;
  11. c += 5;
  12. printf("%d ",c);
  13. }

输出

  1. 6 11

在第一个函数调用期间,c的值被初始化为 1。其值增加了 5。现在,c的值是 6,将其打印在屏幕上。

在第二个函数调用期间,c不会再次初始化为 1。 这是因为c是静态变量。c的值增加 5。现在,它的值将为 11,并打印在屏幕上。