目錄
?聯合體的大小
?聯合體如何省空間
巧用聯合體?
聯合判斷大小端(驚為天人,大佬寫的,我借鑒)?
?枚舉
枚舉類型的使用?
首先我們先看一下菜鳥教程中的對C語言聯合體的說明
?聯合體的大小
?
#include <stdio.h>
union u
{char c;int u;
};int main()
{union u n;printf("%zd\n", sizeof(n));return 0;;
}
?這里為什么是4呢?
?
?這里已經給了我們答案,為了更加直觀,我們取地址打印一下
?
#include <stdio.h>
union u
{char c;int u;
};int main()
{union u n;printf("%p\n", &n);printf("%p\n", &n.c);printf("%p\n", &n.u);return 0;;
}
?
所以聯合體也叫共用體。
我們在這解釋一下聯合體大小應該怎樣計算
1.聯合體的大小至少是最大成員的大小。
2.當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。
上述的計算方法的第二點我們寫個代碼再解釋一下
#include <stdio.h>
union Un1
{char c[5];//5//注意此時如果是數組的話要按照數據所屬的類型大小來計算,char類型就是1//1 8 1int i;//4 8 4
};int main()
{printf("%zd\n", sizeof(union Un1));return 0;
}
?
?有了這樣代碼中的注釋我們或許就能理解結構體大大小是如何計算的。
?聯合體如何省空間
?
對于商品來說,他們具有相同的價格類型,產地信息,但有的商品具有的信息別的商品沒有,我們完全可以寫出一個結構體包含這這個他們的公共屬性和各自具有的屬性,但這樣的話太浪費空間了,比如說你此時就想描述一件商品,那你還需要再描述其他兩件不必要的特殊屬性了。
因此我們的解決辦法是現將公共屬性單獨寫出來,剩余屬于各個商品本身的特殊屬性我們就用聯合體聯合起來,這樣做的話,就節省了空間。
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[20];//設計int colors;//顏色int sizes;//尺寸}shirt;}item;
};
這樣寫就很節省空間了。
巧用聯合體?
?我們來看一個比較厲害的代碼:(一個int類型,一次取出一個字節)
union U
{int n;//4struct S{char c1;char c2;char c3;char c4;}s;//4
};int main()
{union U u = { 0 };u.n = 0x11223344;printf("%x %x %x %x\n", u.s.c1, u.s.c2, u.s.c3, u.s.c4);return 0;
}
聯合判斷大小端(驚為天人,大佬寫的,我借鑒)?
?
int check()
{union{char c;int i;}u;u.i = 1;return u.c;
}int main()
{int ret = check();if (ret == 1)printf("小端\n");elseprintf("大端\n");return 0;
}
?
?此時char不用進行強制轉換,因為字符型的ascll類型也是整型
?枚舉
enum day
{Mon,Tues,Web,Thur,Fri,Sat,Sun
};int main()
{printf("%d\n", Mon);printf("%d\n", Tues);printf("%d\n",Web);printf("%d\n", Thur);printf("%d\n", Fri);printf("%d\n", Sat);printf("%d\n", Sun);return 0;
}
?
枚舉類型默認值為0
還有我們可以對我們枚舉中的數據進行初始化,但他們都是常量,因此在主函數中,我們要再想要改變他們的值,那編譯器就會報錯。我們對其進行初始化我們進行觀察一下
?
?
?我們再來看一下我們在主函數中更改他的值進行報錯的情況:
?
?
因此在使用時我們應該注意。
枚舉類型的變量必須是屬于枚舉類型的,我們對此進行展示
enum day
{Mon=2,Tues=4,Web=5,Thur=6,Fri=9,Sat=11,Sun=19
};int main()
{enum day s = Mon;s = Fri;return 0;
}
?
枚舉的優點:
- 增加代碼的可讀性和可維護性
- 和#define定義的標識符?較枚舉有類型檢查,更加嚴謹。
- 便于調試,預處理階段會刪除 #define 定義的符號
- 使??便,?次可以定義多個常量
- 枚舉常量是遵循作?域規則的,枚舉聲明在函數內,只能在函數內使?
枚舉類型的使用?
enum day
{Mon=2,Tues=4,Web=5,Thur=6,Fri=9,Sat=11,Sun=19
};int main()
{enum day s = Mon;//使用枚舉常量給枚舉變量賦值return 0;
}
?
C語言中可以拿整數給枚舉變量賦值,但C++中不行。
若有收獲,就點個贊吧!