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