列舉與聯合
先來看看兩者的形式
列舉:
#include<stdio.h>
enum Day
{
Mon,
Tues,
Wed,
Thu,
Fri,
Sat,
Sun
};
int main()
{
return 0;
}
聯合體(也叫共用體):
#include<stdio.h>
union Un
{
char c;
int i;
};
int main()
{
return 0;
}
下面分別決議這兩種自定義變數型別:
列舉:
由關鍵字enum 和標簽組成(類似于結構體)
{}里的內容是列舉型別的可能取值
列舉型別的初始化:
列舉型別大括號里代表這種型別的可能取值,一個成員代表一個值,例如現在未進行初始化,則第一個Mon 代表0,第二個Tues 代表1…以此類推
,分別代表一個初始值
當然我們也可以手動賦予這些變數以初始值,格式如下:
#include<stdio.h>
enum day
{
mon = 1,
tues = 2,
wed = 5,
thur = 10
};
int main()
{
return 0;
}
這樣也是一種賦予初始值的方法,和上一種系統自動賦值相比,這一種更自由
當然賦初始值的方法還有很多
例如我們只給第一個元素賦予5,那么其他每個元素就是依次加一
因為列舉,聯合,和之前的結構體位段一樣,都是自定義變數型別,所以關鍵字加標簽都表示一種變數型別,例如現在的enum day 就是一種變數型別
列舉其實就是一種給一個變數賦予一個定值的做法,類似于define宏定義,只不過列舉里有變數型別,而define作用的只是一個符號,不是變數
此外,列舉優于define的點還有 列舉一次可以定義多個變數,而define一次一個
另外,如果想新定義一個列舉變數
用其他型別的資料是不行的
例如這樣是不行的
enum day xingqiba = 8;
需要用列舉型別來賦值
比如這樣(mon的列舉變數在上面已經定義)
enum day xingqiba = mon;
關于聯合體(共用體)
聯合體的成員一般共用一塊空間,這樣一個聯合變數的大小,至少是其中最大成員的大小
例如:
#include<stdio.h>
union Un
{
char a;
int b;
}s1;
int main()
{
printf("%d\n",sizeof(s1));
return 0;
}
結果是
4
Program ended with exit code: 0
看,是不是至少是最大成員的大小,int~4個位元組
原理是什么呢?
原來int 的4個位元組 把第一個位元組拿出來和char型變數共用,意思是我的第一個位元組就是你(有點浪漫)
那么就會導致一個問題
改動char 型變數的時候,int型的值一定會改
那么 改動int的值得時候,char一定會改嗎?
答案:要看是大端存盤還是小端存盤
char型和int型共用的位元組 就是低地址處的那一個位元組
那么int 有4個位元組 比如(用16進制表示,即8個16進制位)
int a = 0x11223344
可見a的比較小的值是44,那他如果存盤在低地址處就是小端,存盤在高地址處就是大端(這個因電腦和環境而異)
例如小端(從左到右為低地址到高地址):
44 33 22 11
大端就是:
11 22 33 44
那么char始終共用的就是第一個位元組,也就是低地址處的那一個位元組,如上例所示,是不是char的值和44一樣還是和11一樣就不一定了
如何判斷當前機器是大端還是小端?
我們可以設計一個函式,
int a = 1;
char* p = &a;
printf("%d",*p);
這樣我們能把a的第一個位元組取出來,如果是小端存盤 列印1,如果是大端存盤列印0
就能分辨了
最后整個聯合體的大小,至少是最大成員的大小,不過不一定是,還要是最大對齊數的倍數
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/226166.html
標籤:其他
下一篇:實戰-專案流程管理
