c語言入門到c++使用高手: c語言入門之結構體與共用體(三)

第十章 結構體與共用體

第三節 共用體,枚舉類型,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;

  • 總結(以整型數組定義爲例)
  1. 先寫出常規的整型數組方法

  2. 將變量替換成自己想用的類型名

  3. 在前面加上typedef

1. int n[100];
2. int N[100];
3. typedef int N[100];
//最後定義對應變量
N a;

  • 說明
  1. 類型別名一般都大寫

  2. typedef是用來定義類型名的,不是用來定義變量的

  3. typedef只是對已經存在的類型增加類型名

  4. typedef是編譯的時候處理的, 可執行文件:編譯(預處理(#define, #include, #ifdef),編譯(typedef), 彙編),鏈接

  5. typedef主要作用是:程序的通用性和可移植性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章