C 语言的存储类别:auto、extern、static、register(示例)

C 语言中的存储类别是什么?

存储类别表示变量的可见性和位置。它告诉我们从代码的哪个部分可以访问一个变量。C 语言中的存储类别用于描述以下内容:

  • 变量的作用域。
  • 变量将存储的位置。
  • 变量的初始化值。
  • 变量的生命周期。
  • 谁可以访问变量?

因此,存储类别用于表示有关变量的信息。

注意:变量不仅与 数据类型、其值相关联,还与存储类别相关联。

C 语言中存储类别的类型有哪些?

总共有四种标准的存储类别。下表展示了 C 语言中的存储类别。

存储类别 目的
auto 它是默认的存储类别。
extern 它是全局变量。
static 它是可以返回值的局部变量,即使控制已转移到函数调用。
register 它是存储在寄存器中的变量。

C 语言中的 Auto 存储类别

使用 auto 存储类别定义的变量称为局部变量。Auto 代表自动存储类别。如果未显式指定,则变量默认属于 auto 存储类别。

auto 变量的作用域仅限于特定的代码块。一旦控制离开代码块,访问就被销毁。这意味着只有声明 auto 变量的代码块才能访问它。

关键字 auto 用于定义 auto 存储类别。默认情况下,auto 变量包含垃圾值。

Example, auto int age;

下面的程序定义了一个包含两个局部变量的函数。

int add(void) {
   int a=13;
   auto int b=48;
return a+b;}

我们使用另一个程序来展示每个代码块中 auto 变量的作用域级别“可见性级别”,它们彼此独立。

#include <stdio.h>
int main( )
{
  auto int j = 1;
  {
    auto int j= 2;
    {
      auto int j = 3;
      printf ( " %d ", j);
    }
    printf ( "\t %d ",j);
  }
  printf( "%d\n", j);}

输出

 3 2 1

C 语言中的 Extern 存储类别

Extern 代表外部存储类别。Extern 存储类别用于在两个或多个文件之间共享全局函数或变量时。

关键字 **extern** 用于声明另一个文件中的全局变量或函数,以提供已在原始文件中定义的变量或函数的引用。

使用 extern 关键字定义的变量称为全局变量。这些变量在整个程序中都可访问。请注意,extern 变量不能初始化,因为它已在原始文件中定义。

Example, extern void display();

第一个文件:main.c

#include <stdio.h>
extern i;
main() {
   printf("value of the external integer is = %d\n", i);
   return 0;}

第二个文件:original.c

#include <stdio.h>
i=48;

结果

 value of the external integer is = 48


要编译和运行上述代码,请遵循以下步骤:

步骤 1)创建新项目,

  1. 选择控制台应用程序
  2. 点击“开始”

Extern Storage Class in C

步骤 2)选择 C 并点击“下一步”

Extern Storage Class in C

步骤 3)点击“下一步”

Extern Storage Class in C

步骤 4)输入详细信息并点击“下一步”

Extern Storage Class in C

步骤 5)点击“完成”

Extern Storage Class in C

步骤 6)将 main.c 文件中的主代码(如上一个程序所示)放入并保存。

Extern Storage Class in C

步骤 7)创建一个新的 C 文件 [文件 -> 新建 -> 空文件,保存(命名为 original.c)并通过在对话框中单击“确定”将其添加到当前项目中。

Extern Storage Class in C

步骤 8)放入并保存上一个示例中 shown 的 original.c 文件的 C 代码,但不要包含 main() 函数。

Extern Storage Class in C

步骤 9)构建并运行您的项目。结果显示在下一张图中。

Extern Storage Class in C

C 语言中的 Static 存储类别

静态变量用于函数/文件内部作为局部静态变量。它们也可以用作 全局变量

  • 静态局部变量是局部变量,它在函数调用或代码块之间保留和存储其值,并且仅对定义它的函数或代码块可见。
  • 静态全局变量是仅对声明它的文件可见的全局变量。
Example: static int count = 10;

请记住,静态变量的默认初始值为零,并且在其生命周期中仅初始化一次。

#include <stdio.h> /* function declaration */
void next(void);
static int counter = 7; /* global variable */
main() {
 while(counter<10) {
      next();
      counter++;   }
return 0;}
void next( void ) {    /* function definition */
   static int iteration = 13; /* local static variable */
   iteration ++;
   printf("iteration=%d and counter= %d\n", iteration, counter);}

结果

iteration=14 and counter= 7
iteration=15 and counter= 8
iteration=16 and counter= 9

全局变量在整个文件中都可访问,而静态变量仅对代码的特定部分可访问。

静态变量的生命周期是整个程序代码。使用 static 关键字声明或初始化的变量始终将零作为默认值。

C 语言中的 Register 存储类别

当您想将函数或代码块内的局部变量存储在 CPU 寄存器中,而不是存储在 RAM 中以快速访问这些变量时,您可以使用 register 存储类别。例如,“计数器”是存储在寄存器中的良好选择。

Example: register int age;

关键字 **register** 用于声明 register 存储类别。使用 register 存储类别声明的变量的生命周期是整个程序。

它类似于 auto 存储类别。变量仅限于特定的代码块。唯一的区别是使用 register 存储类别声明的变量存储在 CPU 寄存器中,而不是内存中。寄存器的访问速度比主内存快。

使用 register 存储类别声明的变量没有默认值。这些变量通常在程序开头声明。

#include <stdio.h> /* function declaration */
main() {
{register int  weight;
int *ptr=&weight ;/*it produces an error when the compilation occurs ,we cannot get a memory location when dealing with CPU register*/}
}

输出

error: address of register variable 'weight' requested

下表总结了 C 语言编程中常用的每种存储类别的关键特征。

存储类别 声明 存储空间 默认初始值 范围 终身
auto 在函数/代码块内部 内存 不可预测 在函数/代码块内 在函数/代码块内
register 在函数/代码块内部 CPU 寄存器 垃圾值 在函数/代码块内 在函数/代码块内
extern 在所有函数之外 内存 整个文件以及已声明为 extern 的其他文件 程序运行时
Static(局部) 在函数/代码块内部 内存 在函数/代码块内 程序运行时
Static(全局) 在所有函数之外 内存 Global 程序运行时

摘要

在本教程中,我们讨论了 C 语言的存储类别,总结如下:

  • C 语言中的存储类别用于表示变量的附加信息。
  • 存储类别表示变量的作用域和生命周期。
  • 它还告诉谁可以访问变量以及从何处访问。
  • Auto、extern、register、static 是 C 程序中的四种不同存储类别。
  • C 语言中的存储类别说明符用于定义变量、函数和参数。
  • auto 用于在代码块或函数中定义的局部变量。
  • register 用于将变量存储在 CPU 寄存器中,而不是内存位置,以便快速访问。
  • Static 用于全局和局部变量。它们各自都有在 C 程序中的用例。
  • Extern 用于 C 项目文件之间的数据共享。