系列文章目錄
文章目錄
前言
?作者簡介:大家好,我是橘橙黃又青,一個想要與大家共同進步的男人😉😉
🍎個人主頁:橘橙黃又青_C語言,函數,指針-CSDN博客
目的:學習聯合體和枚舉類型的聲明聯合體的特點和大小,枚舉類型的有點和使用。
1. 聯合體類型的聲明
像結構體?樣,聯合體也是由?個或者多個成員構成,這些成員可以不同的類型。
但是編譯器只為最?的成員分配?夠的內存空間。聯合體的特點是所有成員共?同?塊內存空間 。所 以聯合體也叫:共?體。
給聯合體其中?個成員賦值,其他成員的值也跟著變化。
#include <stdio.h>
//聯合類型的聲明
union Un
{char c;int i;
};
int main()
{//聯合變量的定義union Un un = {0};//計算連個變量的??printf("%d\n", sizeof(un));return 0;
}
輸出結果:
4
為什么是4呢?接下來我們來了看
?1.2 聯合體的特點
聯合的成員是共?同?塊內存空間的,這樣?個聯合變量的??,?少是最?成員的??(因為聯合 ?少得有能?保存最?的那個成員)。
我們來看兩個例子你就知道了
案例1:
//代碼1
#include <stdio.h>
//聯合類型的聲明
union Un
{char c;int i;
};
int main()
{//聯合變量的定義union Un un = {0};// 下?輸出的結果是?樣的嗎?printf("%p\n", &(un.i));printf("%p\n", &(un.c));printf("%p\n", &un);return 0;
}
輸出結果:
可以看到,說明他們是公用一塊空間的,看圖解析:
案例2:
//代碼2
#include <stdio.h>
//聯合類型的聲明
union Un
{char c;int i;
};
int main()
{//聯合變量的定義union Un un = {0};un.i = 0x11223344;un.c = 0x55;printf("%x\n", un.i);return 0;
}
輸出結果:
這又是怎么回事呢?分析:
也可以這樣理解:
假如,案例1的輸出結果為:
001AF85C
001AF85C
001AF85C
代碼1輸出的三個地址?模?樣,代碼2的輸出,我們發現將i的第4個字節的內容修改為55了。
我們仔細分析就可以畫出,un的內存布局圖。

1.3 相同成員的結構體和聯合體對?
結構體代碼1:
聯合體代碼2:
結構體和聯合體的內存對?:

1.4 聯合體??的計算
? 聯合的???少是最?成員的??。? 當最?成員??不是最?對?數的整數倍的時候,就要對?到最?對?數的整數倍。
怎么理解呢?來看看一個例子:
#include <stdio.h>
union Un1
{char c[5];int i;
};
union Un2
{short c[7];int i;
};
int main()
{//下?輸出的結果是什么?printf("%d\n", sizeof(union Un1));printf("%d\n", sizeof(union Un2));return 0;
}
輸出結果:
怎么算,來看這里:
使?聯合體是可以節省空間的,舉例:
?如,我們要搞?個活動,要上線?個禮品兌換單,禮品兌換單中有三種商品:圖書、杯?、襯衫。
每?種商品都有:庫存量、價格、商品類型和商品類型相關的其他信息。
圖書:書名、作者、?數
杯?:設計
襯衫:設計、可選顏?、可選尺?
那我們不耐?思考,直接寫出?下結構:
struct gift_list
{//公共屬性int stock_number;//庫存量double price; //定價int item_type;//商品類型//特殊屬性char title[20];//書名char author[20];//作者int num_pages;//?數char design[30];//設計int colors;//顏?int sizes;//尺?
};
上述的結構其實設計的很簡單,?起來也?便,但是結構的設計中包含了所有禮品的各種屬性,這樣 使得結構體的??就會偏?,?較浪費內存。因為對于禮品兌換單中的商品來說,只有部分屬性信息 是常?的。?如:
商品是圖書,就不需要design、colors、sizes。
所以我們就可以把公共屬性單獨寫出來,剩余屬于各種商品本?的屬性使?聯合體起來,這樣就可以 介紹所需的內存空間,?定程度上節省了內存。
代碼展示:
struct gift_list
{int stock_number;//庫存量double price; //定價int item_type;//商品類型union{//公用一塊空間,節省空間struct{char title[20];//書名char author[20];//作者int num_pages;//?數}book;struct{char design[30];//設計}mug;struct{char design[30];//設計int colors;//顏?int sizes;//尺?}shirt;}item;
};
1.5 聯合的?個練習
寫?個程序,判斷當前機器是?端?還是?端?
int check_sys()
{union{int i;char c;}un;un.i = 1;return un.c;//返回1是?端,返回0是?端
}
還有一個非常牛逼的代碼,當我看到的時候,我都震驚了,這也太6了,來看:
#include<stdio.h>
int check_sys() {union{int x;char a;}Un;Un.x = 1;// 計算機儲存方式 00 00 00 01如果是小端逆順序。return (Un.a);
}
int main()
{int ret = check_sys();if (ret == 1) {puts("小端");}else {puts("大端");}return 0;
}
輸出結果:
2. 枚舉類型 ?
2.1 枚舉類型的聲明
枚舉顧名思義就是??列舉。
把可能的取值??列舉。
比如:
1.?周的星期?到星期?是有限的7天,可以??列舉2.性別有:男、?、保密,也可以??列舉3.?份有12個?,也可以??列舉4.三原?,也是可以意義列舉
?這些數據的表?就可以使?枚舉了
enum Day//星期
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};
enum Sex//性別
{MALE,FEMALE,SECRET
};
enum Color//顏?
{RED,GREEN,BLUE
};
以上定義的 enum Day , enum Sex , enum Color 都是枚舉類型。
{}中的內容是枚舉類型的可能取值,也叫 枚舉常量 。
這些可能取值都是有值的,默認從0開始,依次遞增1,當然在聲明枚舉類型的時候也可以賦初值。
enum Color//顏?
{RED=2,GREEN=4,BLUE=8
};
2.2 枚舉類型的優點
1. 增加代碼的可讀性和可維護性2. 和#define定義的標識符?較枚舉有類型檢查,更加嚴謹。3. 便于調試,預處理階段會刪除 #define 定義的符號4. 使??便,?次可以定義多個常量5. 枚舉常量是遵循作?域規則的,枚舉聲明在函數內,只能在函數內使?
2.3 枚舉類型的使??
enum Color//顏?
{RED=1,GREEN=2,BLUE=4
};
enum Color clr = GREEN;//使?枚舉常量給枚舉變量賦值
那是否可以拿整數給枚舉變量賦值呢?在C語?中是可以的,但是在C++是不?的,C++的類型檢查? 較嚴格。
好了今天就到這里了,都看到這里了,點一個贊吧,謝謝。