目录
一、结构体
如何定义结构体变量及进行初始化?
struct Point { int x; int y; }p1; //声明类型的同时定义变量p1 struct Point p2; //定义结构体变量p2 //初始化:定义变量的同时赋初值。 struct Point p3 = {x, y}; struct Stu //类型声明 { char name[15];//名字 int age; //年龄 }; struct Stu s = {"zhangsan", 20};//初始化 struct Node { int data; struct Point p; struct Node* next; }n1 = {10, {4,5}, NULL}; //结构体嵌套初始化 struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化 //结构体的自引用 struct Node { int data; struct Node* next; };
二、枚举类型
枚举类型的定义:
enum Day//星期 { Mon, Tues, Wed, Thur, Fri, Sat, Sun }; enum Sex//性别 { MALE, FEMALE, SECRET }; enum Color//颜色 { RED, GREEN, BLUE };
以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。{ }中的内容是枚举类型的可能取值,也叫 枚举常量 。这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。例如:enum Color//颜色 { RED=1, GREEN=2, BLUE=4 };
枚举类型的使用:
例1:
enum Color//颜色 { RED=1, GREEN=2, BLUE=4 }; enum Color clr = GREEN;
这段代码定义了一个枚举类型
Color
,其中列出了三种颜色:RED
、GREEN
和BLUE
。每个颜色都有一个对应的整数值。在代码的最后,我们使用
enum Color clr = GREEN;
将枚举常量GREEN
赋值给变量clr
,这样变量clr
就表示了绿色。例2:
我们可以使用枚举类型作为case后的常量,这样我们更好判断每个case后实现的是什么函数功能。
#include"contact.h" void meau() { printf("*******************************\n"); printf("***** 1、add 2、delete *****\n"); printf("***** 3、find 4、change *****\n"); printf("***** 5、show 6、clean *****\n"); printf("***** 7、sort 0、exit *****\n"); printf("*******************************\n"); } enum op { Exit, add, delete, find, change, show, clean, sort }; int main() { contact newbook; init_book(&newbook); int input; do { meau(); printf("请选择>:"); scanf("%d", &input); switch (input) { case add: add_book(&newbook); break; case delete: delete_book(&newbook); break; case find: find_by_name(&newbook); break; case change: change_information(&newbook); show_book(&newbook); break; case show: show_book(&newbook); break; case clean: clean_book(&newbook); break; case sort: sort_by_name(&newbook); show_book(&newbook); break; case Exit: printf("程序退出!!!\n"); break; default: printf("请重新选择>:\n"); break; } } while (input); }
三、共同体 (联合体)
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
一、联合体的声明:
union Un { char c; int i; };
二、联合体的定义:
union Un un;
三、联合体的特点:
联合的成员是共用同一块内存空间的union Un { int i; char c; }; union Un un; // 下面输出的结果是一样的吗? printf("%d\n", &(un.i)); printf("%d\n", &(un.c));
四、计算联合体的大小:
printf("%d\n", sizeof(un));
原则:
1、联合的大小至少是最大成员的大小。2、当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。详细过程:
例:
union Un1 { char c[5]; // 对齐数为 1 int i; // 对齐数为 4 }; union Un2 { short c[7]; // 对齐数为 2 int i; // 对齐数为 4 }; //下面输出的结果是什么? printf("%d\n", sizeof(union Un1)); printf("%d\n", sizeof(union Un2));
由于联合体中变量共用一块空间且联合体的大小至少是最大成员的大小,所以Un1大小至少为5。又因为Un1中最大对齐数为4,所以Un1的大小为8.
同理Un2大小至少为14,有因为Un2中最大对齐数为4,所以Un2大小为16.