复合数据类型
**
1.struct结构体
**
作用:封装数据(多种不同类型数据存放在一起)
应存放在全局,在访问结构体中的变量时,应用stu.id; stu.name{};
初始化的方式:
在对数组进行初始化时:
strcpy(stu.name, "zhangsan");
在对指针进行初始化时:char *name; 对name进行初始化:
stu.name = (char *)mollac(sizeof((char)*100);
整体初始化:
struct student stu = {
.age = 17;
.name = "zhangsan";
.id = 3};
结构体数组
第一种初始化方式
struct student stu_array[3] =
{{1,"zhangsan",17};
{2,"lisi",18};
{3,"wangwu",19}
};
第二种初始化方式
for(i = 0; i < 3; i++)
{
scanf("%d", &(stu_array[i].id));
scanf("%s", stu_array[i].name):
scanf("%d", &(stu_array[i].age));
}
输出方式
for(i = 0; i < 3; i++)
{
printf("%d", &(stu_array[i].id));
printf("%s", stu_array[i].name);
printf("%d", &(stu_array[i].age));
}
*使用注意事项
字对齐 :含有4个字节,按照4个字节对齐
半字对齐:至多含有2个字节,按照两个字节对齐
其中重要的是
char
short
char
占8个字节
char
char
short
占4个字节
所以在定义结构体时,相同类型的放在一起,节省空间,防止内存空洞
**
2.union
**
unoin node
{
int num;
char ch;
}
union node p;
union node *pp = &p;
p.num = 1;
p.ch = 'a';
pp->ch = 'a';
printf("sizeof(p)=%d\n", sizeof(p));
结果是4,共用体用的是同一段空间,测量的是共用体中最长成员的长度。
存在数据覆盖的问题。
3.枚举
enum node
{
A,
B,
C,
D,
E,
};
用于杜绝幻数,提高代码的可读性,需要大量整数宏时,用枚举