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) 创建新项目,
- 选择控制台应用程序
- 点击前往
步骤2) 选择 C,然后单击下一步
步骤3) 点击下一步
步骤4) 输入详细信息并单击下一步
步骤5) 点击完成
步骤6) 将上图所示的主程序代码放入 main.c 文件中并保存
步骤7) 创建一个新的 C 文件 [文件 -> 新建 -> 空文件,保存(为 original.c)并通过单击对话框中的“确定”将其添加到当前项目中。
步骤8) 放入并保存上例中显示的没有 main() 函数的原始 .c 文件的 C 代码。
步骤9) 构建并运行你的项目。结果如下图所示
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 工程文件之间的数据共享。