重溫C語言(8)之C結構

https://mp.weixin.qq.com/s/2ZsGsUG6wvPk_OU-0ge-hA

[TOC]

結構聲明

struct 關鍵字表明跟在後面的是一個結構

struct man{
    char name[40];
    int age;
};
struct man afra;

afra 是一個結構變量,它的結構佈局是 main

初始化結構

    struct man afra = {
            "Afra55",
            2
    };
    
     printf("我的名字是%s, 我今年%d歲了", afra.name, afra.age);
我的名字是Afra55, 我今年2歲了

指定初始化

 struct man bfra55 = {.age = 12, .name = "Bfra55"};

可以指定某個成員變量的值。

結構中的字符數組和字符指針

struct a {
    char strA[40];
    char strB[20];
}
struct a testA = {"Victor", "Afra55"}

testA 的字符串都存儲在結構變量內部,需要分配60個字節存儲;

struct b {
    char * strA;
    char * strB;
}
struct b testB = {"Victor", "Afra55"}

testB 的字符串都存儲在編譯器存儲常量的地方,結構本身只存儲兩個地址佔用16字節;
注意如果沒有初始化 strA 和 strB 可以是任意地址,直接存儲值很危險;

malloc()

malloc() 可以爲字符串分配合適的存儲空間,能夠有效避免使用字符指針帶來的潛在危險。

// 假設temp字符數組存儲了字符串
testB.strA = (char *) malloc(strlen(temp) + 1);
strcpy(testB.strA, temp)

在使用完內存後,記得使用free()函數釋放內存:

free(testB.strA);

複合字面量結構

對於臨時結構,複合字面亮好用:

(struct a){"Victor", "Afra55"}

flexible array member 伸縮數組成員

struct flex{
    int age;
    char name[];    // 伸縮型數組成員,該成員的內存大小可以通過編程分配
}

伸縮型數組成員必須是最後一個成員;聲明的方括號中是空的;

聲明一個struct flex類型的結構變量時,不能用 name 做任何事,因爲沒有給這個數組預留存儲空間。
通常聲明struct flex類型爲指針,之後用 malloc() 分配足夠空間來存儲伸縮型數組所需的額外空間:

struct flex * pt;
pt = malloc(sizeof(struct flex) + 40 * sizeof(char))

分配空間後,就可以安全的使用這些成員了;當然在使用完內存後,記得使用free()函數釋放內存;

free(pt);

匿名結構

struct user{
    int age;
    struct {char firstname[40]; char lastname[40]}; // 這就是匿名函數
}

初始化:

struct user a = {97, {"Victor", "Afra55"}};

訪問方式:

puts(a.firstname);

保存結構到文件中

struct wifi{
    char neme[40];
    char password[40];
}

可以使用 fread() 進行存儲;

struct wifi a = {"afra", "123"};
fwrite(&a, sizeof(struct wifi), 1, pfile);

sizeof 表示拷貝數據的大小;
1 表示1次拷貝1塊數據;

可以使用 fread() 進行讀取;

fread(&a, sizeof(struct wifi), 1, pfile);

數據類型:union

聯合,能在同一個內存空間中存儲不同的數據類型;

union user{
    int a;
    double b;
    char c;
}

不知道即將要存儲哪種類型的數據,可以使用 union, 聲明 union 的變量只能存儲結構中出現的一種類型的值;

編譯器會給變量分配union聲明中佔用最大空間類型字節,比如 user 中的 double 佔用了最大類型 64位即8字節,那麼 user 的變量是 8 個字節;

union user test;
test.a = 12;   // 12存儲在test中,佔2字節
test.b = 2.0;   // 清除12,存儲 2.0,佔8字節
test.c = 'p';   // 清除2.0,存儲h, 佔1字節

數據類型:enum

枚舉,聲明符號名稱來表示整型常量。

// 枚舉中的常量默認從0開始,red是1,orange是2等
enum spectrum {red, orange, yellow, green, blue, white};
enum spectrum color;

變量 color 的值可能是red, orange, yellow, green, blue, white, 這些符號常量是枚舉符。

color = white;
if(color == white){...}
for(color = red; color <= white; color++){...}
switch(color){
    case red: ...
        break;
    case orange: ...
        break;
        ...
}

可以在聲明枚舉的時候指定整數值:

enum age {unknow, teen = 18, man = 24, old = 70, other};

unknow 默認賦值 0;
other 會默認賦值爲 71;

typedef

typedef 創建的符號名不能用於值,只受限於類型;
其由編譯器解釋,不是預處理器;
說白了,就是別名的意思;

typedef int afra;

afra 就可以定義int類型變量;

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