C 中的存储类:自动、外部、静态、寄存器(示例)

C 中的存储类别是什么?

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

  • 变量范围。
  • 变量的存储位置。
  • 变量的初始化值。
  • 变量的生命周期。
  • 谁可以访问变量?

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

注意: 变量不仅与 数据类型,它的价值也是一个存储类别。

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

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

存储类 目的
汽车 它是一个默认的存储类。
外部 它是一个全局变量。
静止 它是一个局部变量,即使控制权转移到函数调用也能够返回一个值。
寄存器 它是一个存储在寄存器内的变量。

C 语言中的自动存储类

使用自动存储类定义的变量称为局部变量。Auto 代表自动存储类。如果没有明确指定,变量默认为自动存储类。

自动变量的作用域仅限于特定块。一旦控制权离开该块,访问权就会被破坏。这意味着只有声明自动变量的块才能访问它。

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

Example, auto int age;

下面的程序定义了一个具有两个局部变量的函数

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

我们采用另一个程序,它显示每个块代码中彼此独立的自动变量的范围级别“可见性级别”:

#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 变量无法初始化,因为它已经在原始文件中定义。

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. 点击前往

C 中的外部存储类

步骤2) 选择 C,然后单击下一步

C 中的外部存储类

步骤3) 点击下一步

C 中的外部存储类

步骤4) 输入详细信息并单击下一步

C 中的外部存储类

步骤5) 点击完成

C 中的外部存储类

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

C 中的外部存储类

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

C 中的外部存储类

步骤8) 放入并保存上例中显示的没有 main() 函数的原始 .c 文件的 C 代码。

C 中的外部存储类

步骤9) 构建并运行你的项目。结果如下图所示

C 中的外部存储类

C 语言中的静态存储类

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

  • 静态局部变量是在函数调用或块之间保留和存储其值的局部变量,并且仅对定义它的函数或块可见。
  • 静态全局变量是全局可见的变量 仅适用于声明它的文件。
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 语言中的寄存器存储类

当你想将函数或块内的局部变量存储在 CPU 寄存器中时,可以使用寄存器存储类,而不是 内存 以便快速访问这些变量。例如,“计数器”是存储在寄存器中的一个很好的候选。

Example: register int age;

关键字 寄存器 用于声明寄存器存储类型。使用寄存器存储类型声明的变量在整个程序中都有生命周期。

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

使用寄存器存储类型声明的变量没有默认值。这些变量通常在程序开始时声明。

#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 编程中常用的每种存储类的主要特性

存储类 声明 默认初始值 范围 终身版
汽车 在函数/块内 内存 变幻莫测 在函数/块内 在函数/块内
寄存器 在函数/块内 CPU 寄存器 垃圾 在函数/块内 在函数/块内
外部 所有功能之外 内存 整个文件以及将变量声明为 extern 的其他文件 程序运行时
静态(本地) 在函数/块内 内存 在函数/块内 程序运行时
静态(全局) 所有功能之外 内存 全球 程序运行时

总结

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

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