1. 程式人生 > >複合資料型別

複合資料型別

結構體

作用:

封裝資料(把多種不同的資料型別放在一起)

注意:

一般放在全域性;分號不能省略。

結構體變數用點訪問

結構體指標用->訪問

初始化:

靜態初始化

動態初始化

使用注意事項:

給結構體中的陣列成員賦值時,不能直接將字串賦給陣列名,可以使用strcpy函式

給結構體中的指標變數成員賦值時,要先給指標分配空間,否則它會使一個野指標

靜態初始化即在定義的時候直接賦值

結構體陣列的初始化:使用for迴圈來完成

結構體中的對齊方式:

字對齊和半字對齊

字對齊:給每個變數先分配四個位元組的空間,如果下一個資料的資料型別與之相同,就可以放在一起,如果空間不夠就再開闢四個位元組的空間;如果型別不相同,就直接開闢四個位元組的空間

半字對齊:原理和字對齊大致相同,但是分配的空間為2個位元組

特別的:

char

short   :8位元組

char

char

char    :4位元組

short


記憶體空洞:由於字對齊和半字對齊造成的記憶體浪費
解決方法:在定義結構體的時候,儘量將相同型別的資料放在一起

共用體

和結構體的區別:
1.共用體的大小是其中最長的資料型別的長度,共用體中所有的成員共用同一段記憶體空間,但是其也滿足字對齊和半字對齊

2.共用體共用同一段空間,造成資料覆蓋

#include 
union stu
{
    int num;
    char ch;
};
union stu p;
p.num = 1;
p.ch = 'a';
printf("p.num = %d\n",p.num);
執行結果:p.num = 97(後面賦值的ch覆蓋了num,即輸出了’a’的ASCII碼值)

運用:

一般使用共用體來驗證CPU的大小端(大端位元組序和小段位元組是CPU的屬性,與作業系統無關

小端位元組:低位元組存放在低地址,高位元組存放在高地址

大端位元組:高位元組存放在低地址,低位元組存放在高地址

無論大端位元組還是小端位元組,都是從低位元組開始存放的

具體程式:
union node
{
    int num;
    char ch;
}
int main()
{
    union node p;
    
    p.num = 0x12345678;
    
    if(ch == 78)
    {
        printf("Small!\n");
    }
    else
    {
        printf("Big!\n");
    }
    return 0;
}

列舉

只能代替整數巨集

作用:避免幻數,提高程式碼可讀性