欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文帶你認識C語言的聯(lián)合體和枚舉

 更新時間:2024年10月26日 09:59:57   作者:小容小容  
聯(lián)合體(Union)是一種特殊的數據結構,允許在同一內存地址上存儲不同類型的數據,這篇文章主要給大家介紹了關于C語言聯(lián)合體和枚舉的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

一.聯(lián)合體

1.聯(lián)合體的聲明

聯(lián)合體(Union) 是一種特殊的用戶自定義數據類型,它允許在同一內存位置存儲不同類型的數據,但同時只能存儲其中一個成員。聯(lián)合體的所有成員共享相同的內存空間,因此聯(lián)合體的大小等于其最大成員的大小。

我們來看一下簡單定義,有些類似于結構體.。

#include<stdio.h>
union un {
	int age;
	char i;
};
int main() {
	return 0;
}

雖然說結構上有些類似于結構體,但是看特點的話,他兩各不相同,各有所長。

2.聯(lián)合體的特點

(一)內存共享

聯(lián)合體的所有成員共享同一塊內存地址。意味著不論聯(lián)合體有多少成員,它們都會使用同一個存儲空間。只有一個成員可以在同一時刻存儲有效數據。

優(yōu)點:這種特性使聯(lián)合體節(jié)省內存,特別適合多個數據不會同時使用的場景。

我們來看一個例子:

#include<stdio.h>
union un {
	int age;
	char i;
};
int main() {
	union un u = { 0 };
	u.age = 0x11223344;
	u.i = 0x55;
	return 0;
}

我們按F10進入逐過程:

查看內存:可以看到u.i的0x55覆蓋了u.age的44

可以說明他們的內存是共享的!??!

(二)大小等于最大成員的大小

聯(lián)合體的大小等于其最大成員的大小。雖然它可以有多個成員,但只會根據其中最大成員的大小來分配內存。

我們看一下例子:

#include<stdio.h>
union un {
	int age;
	char i;
};
int main() {
	union un u = { 0 };
    //計算一下聯(lián)合體的大小
	printf("%zd", sizeof(u));
	return 0;
}

結果是:

解釋:int四個字節(jié),char一個字節(jié),顯然最大的是四個字節(jié)。聯(lián)合體的大小即最大成員的大小

另一特殊情況:

當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。

看一例子:

#include<stdio.h>
union un {
	char name[10];
	int age;
};
int main() {
	union un u = { 0 };
	printf("%zd", sizeof(u));
	return 0;
}

我們看一下結果:

可以看到聯(lián)合體的大小并不是最大成員的大小10(char1個字節(jié),1*10),是12(最大對齊數4,4的整數倍)

這里10個char類型和int類型就已經占用14個字節(jié)了,但是結果是12個字節(jié),所以這里也能證明聯(lián)合體的特點內存共享。

(三)一次只能使用一個成員

聯(lián)合體(union)的特性是一次只能有效使用一個成員,因為所有成員共享同一塊內存。當你向一個成員賦值時,之前賦值的其他成員數據會被覆蓋。

其實也就是因為另一個特性內存共享導致的

#include <stdio.h>
#include <string.h>

union MyUnion {
    int i;
    float f;
    char str[20];
};

int main() {
    union MyUnion u;

    // 設置整數值
    u.i = 42;
    printf("設置整數后: u.i = %d\n", u.i);

    // 設置浮點數值,覆蓋整數值
    u.f = 3.14;
    printf("設置浮點型之后: u.f = %.2f\n", u.f);
    // 整數值被覆蓋,無法正常讀取
    printf("u.i (設置浮點型之后) = %d (corrupted)\n", u.i);

    // 設置字符串,覆蓋浮點數值
    strcpy(u.str, "Hello");
    printf("設置字符串后: u.str = %s\n", u.str);
    // 浮點數值被覆蓋,無法正常讀取
    printf("u.f (設置字符串后) = %.2f (corrupted)\n", u.f);

    return 0;
}

結果:

3.聯(lián)合體相比較于結構體

(一)內存分配

結構體:

  • 結構體中的每個成員都有自己獨立的內存空間。
  • 結構體的總大小等于所有成員大小的總和(加上可能的內存對齊)。
  • 成員的內存布局是順序的,成員之間不會共享內存

聯(lián)合體:

  • 聯(lián)合體中的所有成員共享同一塊內存。
  • 聯(lián)合體的總大小等于其中最大成員的大小。
  • 只能同時使用一個成員,存入一個成員的值會覆蓋其他成員。

(二)使用方式

  • 結構體

    • 結構體可以同時使用多個成員。每個成員都有獨立的存儲空間,互不干擾。
    • 適合用于描述包含多個相關數據的復雜對象。

(三)內存布局對比

 看看這兩個代碼內存的占用

我們看一下內存分布圖:

(四)總結

特性結構體聯(lián)合體
內存分配每個成員都有獨立內存,大小為所有成員之和。所有成員共享同一塊內存,大小為最大成員。
使用多個成員可以同時使用多個成員。一次只能使用一個成員,修改會覆蓋其他成員。
適用場景同時需要存儲和操作多種數據類型。不同時間只需使用一種數據類型,節(jié)省內存。
訪問速度各成員獨立訪問,互不影響。需要判斷當前存儲的成員類型,可能增加復雜度。

二.枚舉

枚舉(enum)是一種用戶自定義的數據類型,它由一組具名的常量組成。枚舉常用于表示一組相關的離散值,賦予這些值易于理解的名稱,增強代碼的可讀性和維護性。

1.特點

  • 命名常量:枚舉為一組常量提供了有意義的名字,使代碼更具可讀性。
  • 整數值:在大多數編程語言中,枚舉中的每個常量值都與一個整數值對應,通常從 0 開始遞增,除非顯式指定。
  • 類型安全:枚舉類型可以幫助確保在代碼中只能使用有效的枚舉常量,而不會混用其他不相關的值。

2.語法

看個例子:

#include <stdio.h>

enum Weekday {
    SUNDAY,    // 默認值為 0
    MONDAY,    // 1
    TUESDAY,   // 2
    WEDNESDAY, // 3
    THURSDAY,  // 4
    FRIDAY,    // 5
    SATURDAY   // 6
};

int main() {
    enum Weekday today;

    today = WEDNESDAY;

    if (today == WEDNESDAY) {
        printf("Today is Wednesday!\n");
    }

    return 0;
}

結果如圖:

第二個例子(如果對某個成員賦值,后續(xù)成員會從該值開始遞增):

enum EnumName {
    ENUM_VALUE1,      //0
    ENUM_VALUE2,      //1
    ENUM_VALUE3 = 10, // 可以顯式指定值
    ENUM_VALUE4       // 之后的值會遞增,即11
};

枚舉中的每個常量值都與一個整數值對應,通常從 0 開始遞增,除非顯式指定。

ps:要注意每個成員用","隔開

3.特殊情況

(一)枚舉類型的隱式轉換

枚舉類型在 C 語言中實際上是整型,可能導致與整型混淆。比如,可以將整型值賦給枚舉類型:

enum Weekday { SUNDAY, MONDAY, TUESDAY };
enum Weekday day = 3; // 這是合法的,但不安全

(二)枚舉的作用域

在 C 語言中,枚舉的常量在枚舉定義的作用域內可見,但不會限定在枚舉類型內部:

enum Colors { RED, GREEN, BLUE };
int color = RED; // 合法,因為 RED 在全局作用域中可見

(三)缺乏類型安全

盡管枚舉在一定程度上提供了類型安全,但它們的整型本質仍然使得在比較或賦值時存在風險。例如,可以將一個枚舉類型的變量賦值為與之不相關的整數值,這可能導致邏輯錯誤:

enum Direction { NORTH, SOUTH, EAST, WEST };
enum Direction dir = 10; // 合法,但不正確

(四)枚舉的拓展

在 C 語言中,枚舉類型一旦定義就不能被擴展或修改。它的值和成員是固定的。因此,枚舉不能如同其他數據類型那樣進行動態(tài)修改。

總結 

到此這篇關于C語言聯(lián)合體和枚舉的文章就介紹到這了,更多相關C語言聯(lián)合體和枚舉內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C/C++實現通訊錄管理系統(tǒng)(附源碼)

    C/C++實現通訊錄管理系統(tǒng)(附源碼)

    這篇文章主要為大家詳細介紹了如何利用C++實現通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-12-12
  • windows下vscode環(huán)境c++利用matplotlibcpp繪圖

    windows下vscode環(huán)境c++利用matplotlibcpp繪圖

    本文主要介紹了windows下vscode環(huán)境c++利用matplotlibcpp繪圖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • Opencv分水嶺算法學習

    Opencv分水嶺算法學習

    這篇文章主要為大家詳細介紹了Opencv分水嶺算法的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • OpenCV 圖像拼接和圖像融合的實現

    OpenCV 圖像拼接和圖像融合的實現

    本文主要介紹了OpenCV 圖像拼接和圖像融合,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 仿寫C語言string.h頭文件檢驗字符串函數

    仿寫C語言string.h頭文件檢驗字符串函數

    這里給大家分享的是一個C語言string.h頭文件檢驗字符串函數的仿寫,非常的簡單實用,小編覺得這篇文寫的還不錯,希望能夠給你帶來幫助
    2021-11-11
  • c++連接mysql5.6的出錯問題總結

    c++連接mysql5.6的出錯問題總結

    下面小編就為大家?guī)硪黄猚++連接mysql5.6的出錯問題總結。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,祝大家游戲愉快哦
    2016-12-12
  • C/C++哈希表優(yōu)化LeetCode題解997找到小鎮(zhèn)的法官

    C/C++哈希表優(yōu)化LeetCode題解997找到小鎮(zhèn)的法官

    這篇文章主要為大家介紹了C/C++哈希表優(yōu)化題解997找到小鎮(zhèn)的法官示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • c++ 解析yaml文件的步驟

    c++ 解析yaml文件的步驟

    這篇文章主要介紹了c++ 解析yaml文件的步驟,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2020-12-12
  • C++?qt實現打開關閉狀態(tài)按鈕的代碼

    C++?qt實現打開關閉狀態(tài)按鈕的代碼

    這篇文章主要介紹了C++?qt實現打開關閉狀態(tài)按鈕,用QCheckBox可以實現,只要在選擇與未選擇的狀態(tài)設置不同的圖片即可完成,代碼簡單易懂,需要的朋友可以參考下
    2022-03-03
  • C++ read函數讀入int整形數據

    C++ read函數讀入int整形數據

    這篇文章主要介紹了C++ read函數讀入int整形數據的相關資料,需要的朋友可以參考下
    2016-07-07

最新評論