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 文憑在全棧軟件開發中
今天報名