C中的存储类:不同类型的存储类[附示例]

已发表: 2020-10-21

用 C 编码高度集中在每个程序中使用变量。 这些是 C 编程的关键方面。 C 中的每个变量都有两个属性; 类型和存储类。 其中,类型是指变量的数据类型, C中的存储类决定了变量的作用域、生存期和可见性。 C 中的存储类用于查找变量的生命周期、可见性、内存位置和初始值。

在这篇博文中,我们将通过一些编程示例详细了解C 中的存储类、它的类型以及它的特性如何影响程序的输出。 C中的存储类用于表示变量的信息。

学习构建 Swiggy、Quora、IMDB 等应用程序

目录

什么是 C 中的存储类?

C 中的存储类分配将保留在内存中的变量的存储区域。 它们存储在系统的 RAM 中。 除了存储空间之外,它们还确定变量的范围。 C程序中的变量存放在随机存储器中的一个物理位置,主要是设备的内存和CPU寄存器。

C 中的存储类还定义了变量的生命周期并将其称为“本地”或“全局”。 存储类对于定义范围或可见性以及变量的初始值也很有用。 C中主要有四个存储类,即。 自动寄存器静态外部 我们将一一进一步讨论。

C 中的存储类是如何声明的?

C 中的四个存储类在块或程序中声明,存储类说明符为 auto、register、extern、static。 还有一个存储类说明符,以句法形式使用的“typedef”,并且不保留存储。 说明符指示编译器存储变量。 C 中的外部存储类告诉编译器定义的变量是用外部链接声明的。

定义和声明变量之间有一个关键的区别。 定义一个变量就是为变量分配内存并声明它意味着用一个值初始化它。

句法:

storage_class_specifier data_type variable_name;

阅读:适合初学者的 C# 中有趣的项目想法和主题

特殊情况:当程序中没有声明或定义存储类说明符时

变量声明中至少给出了一个存储类说明符。 但是,如果没有指定存储类说明符,则遵循以下规则:

1. 在函数中声明的变量被认为是自动的。

2. 在函数内声明的函数被视为外部函数。

3. 在函数外部声明的变量和函数被认为是静态的,具有外部链接

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

C中有四个存储类,我们来看看它们:

1. C中的自动存储类

如果没有提及存储类,则函数或块中定义的每个变量默认属于自动存储类。 属于自动存储类的函数或块的变量使用 auto 说明符声明。 C 中 auto下的变量对于定义它们的块是本地的,并在块外被丢弃。

一个显示自动存储类的简单程序:

#include <stdio.h>

int main()

{

自动int i = 11;

{

自动int i = 22;

{

自动int i = 33;

printf (“%d”, i);

}

printf (“%d”, i);

}

printf ("%d", i);

}

程序的输出:

3 2 1

解释:

在上面的程序中,变量 i 被声明了 3 次。 同名的变量可以定义在不同的块中。 因此,该程序将成功编译和执行而不会出现任何错误。 最里面的块中的函数'printf'将打印3,并且该块中的变量i将在块结束后被销毁。

下一个,第二个外部块打印 2,然后外部块打印 1。自动变量已正确初始化; 否则你会得到未定义的值,因为编译器没有给它们一个初始值。

2.在C中注册存储类

属于寄存器存储类的变量等价于 C 中的 auto,但存储在 CPU 寄存器中而不是内存中,因此得名。 它们是经常访问的。 寄存器说明符用于声明寄存器存储类的变量。 寄存器存储类的变量是块本地的,它们在块结束时被定义和销毁。

一个显示寄存器存储类的简单程序:

#include <stdio.h>

主函数()

{

注册 int i = 10;

int *p = &i; //error: 请求的寄存器变量地址

printf (“i 的值: %d”, *p);

printf (“i的地址:%u”, p);

}

解释:

在上面的程序中,代码试图将变量 i 的地址放入指针变量 p 中,但由于 i 被声明为寄存器变量,代码将无法编译并显示错误“错误:请求的寄存器变量地址” .

只有某些类型的变量被放入寄存器。 寄存器变量没有被编译器赋予初始值。

学习: C++ 与 Java:C++ 和 Java 之间的区别

3. C中的静态存储类

静态变量在其函数或文件之外的可见性为零,但它们的值在调用之间保持不变。 具有静态存储类的变量使用静态说明符声明。 静态变量位于函数或文件中。 static 说明符对局部变量和全局变量的作用不同。

显示具有局部和全局变量的静态存储类的简单程序:

一世。 局部变量

#include <stdio.h>

无效静态演示()

{

静态整数我;

{

静态int i = 1;

printf (“%d”, i);

我++;

}

printf ("%d", i);

我++;

}

主函数()

{

静态演示();

静态演示();

}

程序的输出:

1 0

2 1

解释:

当局部变量由静态说明符定义时,在函数或块内,编译器中会创建永久存储空间。 静态局部变量对指定它的函数或块可见,并在函数调用之间保留其值。 在上面的程序中,静态变量 i 定义在 staticDemo() 函数内部的两个块中的两个位置。 staticDemo() 在 main 函数中被调用两次。 在下一次调用中,静态变量保留其旧值,无需再次初始化。

ii. 全局变量

#include <stdio.h>

静态int gInt = 1;

静态无效静态演示()

{

静态整数我;

printf (“%d”, i);

我++;

printf ("%d", globalInt);

全局整数++;

}

主函数()

{

静态演示();

静态演示();

}

程序的输出:

0 1

1 2

解释:

静态变量只需要在程序中初始化一次,并且在整个生命周期中都会保留。 它们的默认初始值为零。

当全局变量或函数由静态说明符定义时,该变量或函数仅对定义它的文件是已知的。 对于全局变量,其他文件例程无法访问和更改其内容,因为静态全局变量具有内部链接。 在上面的程序中,静态全局变量 globalInt 和一个静态函数 staticDemo() 被定义为静态,不能在 C 文件之外使用。

4. C 中的外部存储类

外部存储类变量或函数由“extern”说明符声明。 当使用 extern 说明符声明变量时,不会为该变量分配存储空间,并且假定它已在程序的其他地方定义。 使用 extern 说明符时,变量不会被初始化。 之所以使用extern 在程序中指定一个变量来声明它与外部链接。

一个显示外部存储类的简单程序:

#include <stdio.h>

外部国际我;

主函数()

{

printf ("i: %d", i);

}

诠释 i = 1;

解释:

在上面的C程序中,如果去掉extern int i,会报错“Undeclared identifier 'i' ,因为变量i是在printf中使用后定义的。 extern 说明符指示编译器变量 i 已定义并在此处声明。

如果你改变 extern int i; 到外部 int i = 5; 你会得到一个错误“Redefinition of 'i'” ,因为 extern 说明符没有初始化一个变量。

另请阅读:初学者 C 语言中最令人兴奋的 7 个项目创意

最后的话

本文详细介绍了C 中存储类的概念,并告诉您它的类型之间有何不同。 何时使用特定存储类取决于您正在处理的变量的分配和范围、生命周期和可见性。

如果您有兴趣了解更多信息并需要行业专家的指导,请查看 upGrad & IIIT Banglore 的全栈软件开发PG 文凭。

为未来的职业做准备

升级和 IIIT-BANGALORE 的 PG 文凭在全栈软件开发中
今天报名