C 语言 - 存储类

C 语言存储类

存储类定义了变量的生命周期可见性内存位置

C 语言中有四种主要的存储类说明符:

  • auto
  • static
  • register
  • extern

作用域和存储类的区别

作用域定义了变量可以在哪里使用,而存储类定义了变量持续多长时间以及存储在哪里。本章是 C 语言作用域章节 的延续。

auto

auto 关键字用于局部变量。它是函数内部声明的变量的默认属性,因此很少显式使用。

实例

int main() {
  auto int x = 50;  // 等同于:int x = 50;
  printf("%d\n", x);
  return 0;
}

亲自试一试

static

static 关键字改变了变量或函数在生命周期可见性方面的行为:

  • 静态局部变量在函数调用之间保持其值。
  • 静态全局变量/函数在其文件外部不可见。

实例

void count() {
  static int myNum = 0; // 在调用之间保持其值
  myNum++;
  printf("num = %d\n", myNum);
}

int main() {
  count();
  count();
  count();
  return 0;
}

结果:

num = 1
num = 2
num = 3

亲自试一试

尝试从示例中移除 static 关键字以查看区别。

register

register 关键字建议将变量存储在 CPU 寄存器中(以便更快地访问)。

您不能使用 & 获取寄存器变量的地址。

注意:register 关键字基本上已经过时了——现代编译器会自动选择最佳的变量保存在寄存器中,因此您通常不需要使用它。

实例

int main() {
  register int counter = 0;
  printf("Counter: %d\n", counter);
  return 0;
}

亲自试一试

extern

extern 关键字告诉编译器变量或函数是在另一个文件中定义的。

在处理多个源文件时,它经常被使用。

文件 1: main.c

#include <stdio.h>

extern int shared;  // 在此声明,在另一个文件中定义

int main() {
  printf("shared = %d\n", shared);
  return 0;
}

文件 2: data.c

int shared = 50;  // 变量的定义

一起编译这两个文件:

gcc main.c data.c -o program