第十章 結構體與共用體
第三節 共用體,枚舉類型,typedef
1. 共用體
-
又叫聯合
-
把幾種不同類型的變量存放到同一段內存單元(同一個內存地址開始的單元中),幾個變量共同佔用同一段內存的結構,就叫共用體
-
定義形式:
union 共用體名
{
成員列表
}變量列表
- 實例一
union myuni
{
int carnum;
char cartype;
char cname[60];
}a,b,c;//將共用體定義和變量定義放在一起
- 實例二
union myuni
{
int carnum;
char cartype;
char cname[60];
};
union myuni a, b, c;
- 結構體和共用體是明顯不同的,結構體佔用的內存是各個成員佔用的內存之和,共用體是佔用的內存是成員變量中最長的成員長度
#include <iostream>
#include <cstring>
union myuni {
int carnum;
char cartype;
char cname[60];
};
struct mystru {
int carnum;
char cartype;
char cname[60];
};
int main(int argc, char *argv[]) {
printf("struct mystru %d\n", sizeof(mystru));
printf("union myuni %d\n", sizeof(myuni));
return 0;
}
幾點說明
-
共用體變量的引用,a.carnum
-
共用體變量的特點:每一個瞬間只能存放其中一種,即只有一個成員存在
#include <iostream>
#include <cstring>
union myuni {
int carnum;
char cartype;
char cname[60];
}a;
struct mystru {
int carnum;
char cartype;
char cname[60];
};
int main(int argc, char *argv[]) {
a.carnum = 123;
strcpy(a.cname, "FF");
printf("a.carnum: %d\n", a.carnum);
printf("a.cname: %s\n", a.cname);
return 0;
}
-
共用體變量地址和其成員變量的地址都一樣
-
共用體變量不能在定義的時候初始化,只能給定第一個成員類型
-
不能把共用體變量作爲函數參數,也不能讓函數返回共用體變量
2. 枚舉類型
- 四種顏色: 紅, 綠, 藍, 黃, // Red表示紅色, Green表示綠色, Blue表示藍色, Yellow表示黃色
enum color
{
//枚舉常量(當成編號,整型數字)
Red, //0
Green, //1
Blue, //2
Yellow //3
};
enum color mycolor1, mycolor2;//定義了兩個枚舉變量
- 說明:
a) 枚舉:就是將值一一列舉出來,那麼mycolor1和mycolor2變量的值只限於列出來的這些值的範圍內
b) Red, Green, Blue, Yellow都是枚舉常量(當成編號,整型數字),不能改變
c) 可以直接給枚舉型變量賦值
#include <iostream>
#include <cstring>
enum color {
//枚舉常量(當成編號,整型數字)
Red, //0
Green, //1
Blue, //2
Yellow //3
};
int main(int argc, char *argv[]) {
enum color mycolor;
mycolor = Red;
printf("sizeof color: %d\n", sizeof(mycolor));
return 0;
}
d) 定義枚舉常量時,可以給枚舉常量賦值
#include <iostream>
#include <cstring>
enum color {
//枚舉常量(當成編號,整型數字)
Red=-6,
Green, //-7
Blue=8,
Yellow //9
};
int main(int argc, char *argv[]) {
enum color mycolor;
mycolor = Yellow;
printf(" Yellow: %d\n", mycolor);
return 0;
}
-
枚舉值就可以理解成整型值, 枚舉值也可以賦給整型
-
枚舉值可以做比較
#include <iostream>
#include <cstring>
enum color {
//枚舉常量(當成編號,整型數字)
Red = -6,
Green, //-7
Blue = 8,
Yellow //9
};
int main(int argc, char *argv[]) {
enum color mycolor;
mycolor = (enum color) (-6);
if (mycolor == Red) {
printf("ok!\n");
}
// 枚舉值就是整型值, 它們是可以互通的,但是一般不這麼使用
mycolor = (enum color) (20000);
printf("%d\n", mycolor);
int c = Red;
printf("%d\n", c);
return 0;
}
3. 用typedef來定義類型
- 使用typedef來定義新的類型名,來代替已有的類型名
typedef int INTEGER; // 用INTEGER代表了int
INTEGER a;
- 定義結構體變量
typedef struct date
{
int year;
int month;
int day;
}DATA;//定義結構體變量
DATA birthday;
DATA *p;//p爲指向此結構體類型數據的指針
- 變形
a) typedef int NUM[100];//定義NUM爲整型數組類型, NUM n ==> int n[100];
b) typedef char *PSTRING; //定義PSTRING爲字符指針類型, PSTRING p ==> char *p
c) typedef int (*POINTER()); //定義POINTER爲指向函數的指針類型,該函數返回的類型是int型, POINTER p1;
- 總結(以整型數組定義爲例)
-
先寫出常規的整型數組方法
-
將變量替換成自己想用的類型名
-
在前面加上typedef
1. int n[100];
2. int N[100];
3. typedef int N[100];
//最後定義對應變量
N a;
- 說明
-
類型別名一般都大寫
-
typedef是用來定義類型名的,不是用來定義變量的
-
typedef只是對已經存在的類型增加類型名
-
typedef是編譯的時候處理的, 可執行文件:編譯(預處理(#define, #include, #ifdef),編譯(typedef), 彙編),鏈接
-
typedef主要作用是:程序的通用性和可移植性