# 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，并打印在屏幕上。