C 中的存储类:C 中的 auto、extern、static、register 类
什么是 C 中的存储类?
存储类表示变量的可见性和位置。它告诉我们可以从代码的哪一部分访问变量。 C中的一个存储类用于描述以下内容:
- 变量范围。
- 将存储变量的位置。
- 变量的初始化值。
- 变量的生命周期。
- 谁可以访问变量?
因此使用存储类来表示变量的信息。
注意:变量不仅与数据类型及其值相关联,还与存储类相关联。
共有四种类型的标准存储类。下表代表了 C 中的存储类。
存储类 目的 自动 它是一个默认的存储类。extern 它是一个全局变量。静态 它是一个局部变量,即使在控制权转移到函数调用时也能返回一个值。寄存器 它是一个存储在寄存器中的变量。在本 C 教程中,您将通过示例学习 C 中不同类型的存储类-
- C 中的自动存储类
- C 中的外部存储类
- 第一个文件:main.c
- 第二个文件:original.c
- C 中的静态存储类
- 在 C 中注册存储类
C 中的自动存储类
使用自动存储类定义的变量称为局部变量。 Auto代表自动存储类。如果没有明确指定,变量默认在自动存储类中。
自动变量的范围仅限于特定块。一旦控制离开块,访问就被破坏了。这意味着只有声明了 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 变量无法初始化,它已在原始文件中定义。
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 文件 [File -> new -> Empty File ,保存(作为 original.c )并在对话框中单击“确定”将其添加到当前项目中。
第 8 步) 放入并保存上例中没有 main() 函数的 original.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 寄存器而不是 RAM 中的函数或块中以快速访问这些变量时,可以使用寄存器存储类。例如,“计数器”是存储在寄存器中的理想选择。
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 编程中常用的每个存储类的主要特性
存储类 声明 存储 默认初始值 范围 终生 自动 在函数内部/blockMemoryUnpredictableWithin the function/blockWithin the function/blockregister 在函数/块内部CPU RegistersGarbageWithin the function/blockWithin the function/blockextern 在所有函数之外MemoryZero整个文件和变量声明为externprogram runtime的其他文件静态(本地) 在函数/blockMemoryZeroWithin 函数/块程序运行时内静态(全局) 外所有函数MemoryZeroGlobal程序运行时总结
在本教程中,我们讨论了 C 中的存储类,总结一下:
- C 中的存储类用于表示有关变量的附加信息。
- 存储类表示变量的范围和生命周期。
- 它还告诉谁可以访问变量以及从哪里访问?
- Auto、extern、register、static 是 C 程序中的四种不同的存储类。
- C 语言中的存储类说明符用于定义变量、函数和参数。
- auto 用于定义在块或函数中的局部变量
- 寄存器用于将变量存储在 CPU 寄存器中,而不是内存位置,以便快速访问。
- 静态用于全局变量和局部变量。每一个在 C 程序中都有其用例。
- Extern 用于 C 项目文件之间的数据共享。
C语言