結構體:是一種構造數據類型
結構體的用途:把不同的數據類型整合起來,成爲一個自定義的數據類型
定義結構體
第一種方式
struct User{
//年齡
int age;
//用戶名
char name[10];
};
第二種方式
struct User{
int age;
char name[10];
} u = {18,"Zero"},u1;
第三種方式
struct User{
int age;
char name[10];
} u1,u2,u3;
第四種方式
struct Order{
int count;
char name[10];
};
struct User{
int age;
char name[10];
Order order;
};
第五種方式
struct User{
int age;
char name[10];
struct Order{
int count;
char name[10];
} order;
};
第六種方式,數組:
struct User{
int age;
char name[10];
} u1[2],u2[2] = {{18,"Zero"},{20,"迷離"}};
匿名結構體
一般情況下,定義的同時至少有一個申明變量,否則沒有什麼意義
好處:你可以控制結構體變量數量(限量版),一定程度上避免了出現結構體重名情況
struct{
int age;
double height;
char name[10];
} u1,u2;
使用結構體
struct User u = {18,"Zero"};
printf("%d, %s\n",u.age,u.name);
第二種使用方式-成員賦值
struct User u;
u.age = 20;
u.name = "Dream";//錯誤的賦值方式
strcpy(u.name,"Dream");
第四第五種定義方式使用:
struct User u = {18,"Zero",{999,"女裝"}};
struct User u;
u.age = 100;
strcpy(u.name,"Zero");
u.order.count = 1000;
strcpy(u.order.name,"男裝");
第六種定義方式(數組方式)使用:
u1[0].age = 100;
strcpy(u1[0].name,"Zero");
結構體和指針
struct User{
int age;
int height;
char name[20];
};
使用
struct User u = {18,180,"Zero"};
struct User *p = &u;
printf("%d, %d, %s",(*p).age,(*p).height,(*p).name);
(*p).age 等價於 p->age(簡寫)
結構體和內存(字節對齊)
結構體在內存中也是一塊區域(有順序,線性排列)
結構體字節對齊規則:
- 結構體變量的大小需要滿足被最寬基本數據類型的成員大小所整除(int double float)
- 結構體變量的成員的首地址偏移量必須是最寬的基本數據類型的整數倍
例如:int 4字節 double8字節,常理說應該12字節。但是結構體必須滿足 (結構體 % 最寬成員大小 = 0)最寬數據類型整倍數。所以 結構體大小爲16.
struct User{
int age;
double height;
};
int main(){
struct User u = {18,165};
//打印結構體大小
//按常理來說:12字節,但是結果卻是:16字節
//12%8?不成立 16%8=0成立
printf("大小: %lu\n",sizeof(u));
//爲什麼C語言要這麼設計?
//初衷:就是爲了提高讀取效率(提高讀取性能)
//劉翔跨欄(110):每隔10米一個欄,如果每一個欄之間的距離不統一,那麼跨欄難度係數會加大
//遵循規律(節奏)
getchar();
return 0;
}
結構體動態內存分配
數組(動態內存分配)-數組大小是3
struct User *p = (struct User *)malloc(sizeof(struct User) * 3);
接下來可以通過數組方式操作結構體
typedef 別名簡化操作
定義:第一種寫法
struct User{
int age;
double height;
char name[10];
};
typedef struct User mUser;
定義:第二種寫法
typedef struct User{
int age;
double height;
char name[10];
} mUser,AgeUser;
使用
mUser user;
user.age = 18;
user.height = 165.00;
聯合體(共同體:union關鍵字)
作用:使多個不同類型的變量共用一塊內存區域,聯合體變量任何時候只有一個成員變量在內存中存在
好處:節約內存
聯合體大小(在C語言中系統分配內存的機制)
條件一:最大的成員字節大小
條件二:還必須是最大的成員的基本數據類型的字節數的整數倍
union Student{
int id;
float height;
char sex;
char name[10];
};
使用:
union Student stu;
strcpy(stu.name,"XXXX");
stu.id = 100;
聯合體-匿名聯合體
好處:你可以控制結構體變量數量(限量版),一定程度上避免了出現結構體重名情況
第一種定義方式-匿名結構體
union{
int age;
char name[10];
} u;
使用:u.age = 100;
第二種方式:
static union{
int age;
char name[10];
};
使用:
age = 100;
strcpy(name,"Zero");
printf("%d\n",age);
printf("%s\n",name);
枚舉
枚舉(定義:enum)—int類型
總結:基本上和Java差不多
好處:限定了值,保證取值的安全性
enum MessageType{
//文本類型
Text = 10,
//圖片類型
Image = 20,
};
使用:
enum MessageType d = Text;
printf("Text: %d\n",d);
枚舉取別名
typedef enum MessageType{
//文本類型
Text = 10,
//圖片類型
Image = 20,
} Message;
使用:
Message d = Text;
匿名枚舉
enum{
//文本類型
Text = 10,
//圖片類型
Image = 20
} Message;
使用:
Message = Text;