跳到主要内容

C 语言存储类

提示
  1. 存储类的基本概念:C语言中的每个变量都有类型和存储类,其中存储类决定了变量的作用域、可见性和生命周期,包括自动(automatic)、外部(external)、静态(static)和寄存器(register)四种类型。
  2. 局部变量和全局变量:在一个块内声明的变量称为局部变量,它们仅在该块中存在;而在所有函数外声明的变量称为全局变量,它们在程序的任何函数中都是可访问的。
  3. 静态变量和寄存器变量:用static关键字声明的静态变量其值在程序执行期间持续存在;用register关键字声明的寄存器变量旨在优化速度,但现代编译器的代码优化使其很少使用。

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

类型指的是变量的数据类型。存储类别决定了变量的作用域、可见性和生命周期。

有4种类型的存储类别:

  1. 自动(automatic)
  2. 外部(external)
  3. 静态(static)
  4. 寄存器(register)

局部变量

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

让我们看一个例子。

#include <stdio.h>

int main(void) {

for (int i = 0; i < 5; ++i) {
printf("C编程");
}

// 错误:此处i未声明
printf("%d", i);
return 0;
}

当你运行上面的程序时,会得到一个未声明标识符i的错误。这是因为i是在for循环代码块内声明的。在这个代码块之外,它是未声明的。

让我们再看一个例子。


int main() {
int n1; // n1是main()的局部变量
}

void func() {
int n2; // n2是func()的局部变量
}

在上面的例子中,n1是main()的局部变量,而n2是func()的局部变量。

这意味着你不能在func()内访问n1变量,因为它只存在于main()内。同样,你不能在main()内访问n2变量,因为它只存在于func()内。

全局变量

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

示例1:全局变量

#include <stdio.h>
void display();

int n = 5; // 全局变量

int main()
{
++n;
display();
return 0;
}

void display()
{
++n;
printf("n = %d", n);
}

输出

n = 7

假设,在file1中声明了一个全局变量。如果你试图在不同的文件file2中使用该变量,编译器会报错。为了解决这个问题,在file2中使用关键字extern来指示外部变量在另一个文件中被声明。

寄存器变量

关键字register用于声明寄存器变量。寄存器变量被认为比局部变量更快。

然而,现代编译器在代码优化方面非常出色,使用寄存器变量加快程序速度的机会很少。

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

静态变量

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

static int i;

静态变量的值直到程序结束时才会消失。

示例2:静态变量

#include <stdio.h>
void display();

int main()
{
display();
display();
}
void display()
{
static int c = 1;
c += 5;
printf("%d ",c);
}

输出

6 11

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

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