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類型變量;