結構體(Struct)與聯合體(Union)的區別

一、定義和用法

結構體(Struct)和聯合體(Union)是C語言中同屬於複合數據類型的一種類型,兩者都可以封裝多個不同類型的數據,但是卻有着顯著的不同之處。

1. 結構體的定義和用法

結構體是一種用戶定義的數據類型,它可以用來封裝多個不同類型的數據。通常情況下,結構體成員被設計為具有不同的數據類型。結構體通常被用來代表一個數據對象,例如汽車、學生、員工等等。C語言中結構體由多個成員組成,每個成員可以是不同類型的數據。


struct car {
    char brand[20];
    char model[20];
    int year;
    float price;
};

上述代碼定義了一個名為car的結構體,它包含四個成員,分別是char類型的brand和model、int類型的year和float類型的price。我們可以使用結構體來表示一輛汽車。

2. 聯合體的定義和用法

聯合體是一種特殊的結構體,它的所有成員共享同一段內存。聯合體的所有成員使用同一份內存空間,所以修改其中某一個成員的值,會影響到另一個成員的值。聯合體通常被用來節省內存,例如有一些數據只用到其中一個成員。


union data {
    int integer;
    float decimal;
};

上述代碼定義了一個名為data的聯合體,它包含了兩個成員,一個是int類型的integer,另一個是float類型的decimal,它們佔據同一段內存空間。我們可以使用聯合體來表示一個數據,可以是一個整數或者是一個浮點數。

二、內存布局

結構體和聯合體的內存布局也有着非常大的區別。

1. 結構體的內存布局

結構體的內存布局是將每個成員單獨分配內存,並依次排列。每個成員在內存中的地址都是連續的,各成員之間在內存中沒有任何關聯。


struct car {
    char brand[20];
    char model[20];
    int year;
    float price;
};

struct car mycar;

上述代碼定義了一個名為mycar的結構體變量。

內存圖:


    0          20              40          44
 +----------+----------------+----------+----------+
 |   brand  |     model      |   year   |   price   |
 +----------+----------------+----------+----------+
 |                                                       |
 mycar

在內存中,四個成員按照定義的順序被依次排列。用sizeof運算符可以計算結構體的大小(單位為字節)。


printf("%zu", sizeof(mycar)); // 輸出:44

2. 聯合體的內存布局

聯合體的內存布局只分配聯合體中最大的成員所需要的內存空間,不管其他的成員的大小是多少。每個成員在內存中的地址都是相同的。


union data {
    int integer;
    float decimal;
};

union data mydata;

上述代碼定義了一個名為mydata的聯合體變量。

內存圖:


   0-3    4-7
 +-------+
 |integer|   4 bytes
 +-------+
   OR
 +-------+
 |decimal|   4 bytes
 +-------+
 mydata

在內存中,union中僅分配了4個字節的空間,不管是integer還是decimal都使用這4個字節,因此,修改一個成員會影響到另外一個成員。


mydata.integer = 12;
printf("%d, %f", mydata.integer, mydata.decimal); // 輸出:12, 0.000000

mydata.decimal = 23.45;
printf("%d, %f", mydata.integer, mydata.decimal); // 輸出:1093507190, 23.450001

三、應用場景

1. 結構體的應用場景

結構體通常被用來封裝多個相關類型的數據,使得這些數據可以統一管理,方便使用。例如,用結構體來表示一個學生信息。


struct student {
    char name[20];
    int age;
    char gender[6];
};

2. 聯合體的應用場景

聯合體通常被用來在一段內存空間中同時表示多個數據類型,這些數據類型在不同的時間和場合下只有一個會被使用。例如,用聯合體來表示數據類型轉換。


union data {
    int integer;
    float decimal;
};

void swap(union data *a, union data *b) {
    union data temp = *a;
    *a = *b;
    *b = temp;
}

union data d1, d2;
d1.integer = 12345;
d2.decimal = 67.89;

swap(&d1, &d2);

printf("%d, %f", d1.integer, d2.decimal); // 輸出:1090873190, 12345.000000

四、小結

結構體和聯合體是C語言中的兩種複合數據類型,結構體將多個不同類型的成員按順序排列在一起,並分配不同的內存空間;聯合體將多個數據類型的成員共享同一段內存,以節省內存空間。兩者在應用場景上也有所不同,需要根據實際需求選擇使用。

原創文章,作者:STKNP,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/333929.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
STKNP的頭像STKNP
上一篇 2025-02-01 13:34
下一篇 2025-02-05 13:04

相關推薦

  • Python中new和init的區別

    new和init都是Python中常用的魔法方法,它們分別負責對象的創建和初始化,本文將從多個角度詳細闡述它們的區別。 一、創建對象 new方法是用來創建一個對象的,它是一個類級別…

    編程 2025-04-29
  • Sublime Test與Python的區別

    Sublime Text是一款流行的文本編輯器,而Python是一種廣泛使用的編程語言。雖然Sublime Text可以用於編寫Python代碼,但它們之間有很多不同之處。接下來從…

    編程 2025-04-29
  • Shell腳本與Python腳本的區別

    本文將從多個方面對Shell腳本與Python腳本的區別做詳細的闡述。 一、語法差異 Shell腳本和Python腳本的語法存在明顯差異。 Shell腳本是一種基於字符命令行的語言…

    編程 2025-04-29
  • Python中while語句和for語句的區別

    while語句和for語句是Python中兩種常見的循環語句,它們都可以用於重複執行一段代碼。然而,它們的語法和適用場景有所不同。本文將從多個方面詳細闡述Python中while語…

    編程 2025-04-29
  • Web程序和桌面程序的區別

    Web程序和桌面程序都是進行軟件開發的方式,但是它們之間存在很大的區別。本文將從多角度進行闡述。 一、運行方式 Web程序運行於互聯網上,用戶可以通過使用瀏覽器來訪問它。而桌面程序…

    編程 2025-04-29
  • Vue TS工程結構用法介紹

    在本篇文章中,我們將從多個方面對Vue TS工程結構進行詳細的闡述,涵蓋文件結構、路由配置、組件間通訊、狀態管理等內容,並給出對應的代碼示例。 一、文件結構 一個好的文件結構可以極…

    編程 2025-04-29
  • Python程序的三種基本控制結構

    控制結構是編程語言中非常重要的一部分,它們指導着程序如何在不同的情況下執行相應的指令。Python作為一種高級編程語言,也擁有三種基本的控制結構:順序結構、選擇結構和循環結構。 一…

    編程 2025-04-29
  • TensorFlow和Python的區別

    TensorFlow和Python是現如今最受歡迎的機器學習平台和編程語言。雖然兩者都處於機器學習領域的主流陣營,但它們有很多區別。本文將從多個方面對TensorFlow和Pyth…

    編程 2025-04-28
  • 麥語言與Python的區別

    麥語言和Python都是非常受歡迎的編程語言。它們各自有自己的優缺點和適合的應用場景。本文將從語言特性、語法、生態系統等多個方面,對麥語言和Python進行詳細比較和闡述。 一、語…

    編程 2025-04-28
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28

發表回復

登錄後才能評論