16.1 结构变量
- 联合是具有不同类型的值的集合(1)
- 结构体变量的初始化
- 可以短于初始化,剩余的成员用 0 表示
- 对结构的操作
- . 操作符取值,点操作符的优先级位于最高级(3)
- 对结构体输入值(4)
- 可以对相同类型的结构体相互赋值(5)
// 1
// 定义仓库中零件信息的结构体
struct
{
// 编号
int number;
// 名称
char name[NAME_LEN+1];
// 现有数量
int on_hand;
} part1,part2;
// 2
// 定义仓库中零件信息的结构体,并初始化
struct
{
// 编号
int number;
// 名称
char name[NAME_LEN+1];
// 现有数量
int on_hand;
} part1={528,"Disk drive",10},
part2 = {914,"Printer cable",5};
// 3
#include <stdio.h>
// 定义仓库中零件信息的结构体
struct
{
// 编号
int number;
// 名称
char name[20];
// 现有数量
int on_hand;
} part1={528,"Disk drive",10},
part2 = {914,"Printer cable",5};
int main()
{
printf("打印出 part1 的 number 编号:%d\n",part1.number);
}
// 输出
打印出 part1 的 number 编号:528
// 4
#include <stdio.h>
// 定义仓库中零件信息的结构体
struct
{
// 编号
int number;
// 名称
char name[20];
// 现有数量
int on_hand;
} part1={528,"Disk drive",10},
part2 = {914,"Printer cable",5};
int main()
{
printf("修改 part1 的 number 编号:") ;
// 注意 scanf 中不能在 %d 后面加 /n
scanf("%d",&part1.number);
printf("打印出 part1 的 number 编号:%d\n",part1.number);
}
// 输出
修改 part1 的 number 编号:615
打印出 part1 的 number 编号:615
// 5
#include <stdio.h>
// 定义仓库中零件信息的结构体
struct
{
// 编号
int number;
// 名称
char name[20];
// 现有数量
int on_hand;
} part1={528,"Disk drive",10},
part2 = {914,"Printer cable",5};
int main()
{
part1 = part2;
printf("%d,%s,%d\n",part1.number,part1.name,part1.on_hand);
}
// 输出
// 914,Printer cable,5
1. 结构体变量在内存中的存储
如,上面的 part1
16.2 结构类型
- 不是在同一处定义的结构体变量,即使完全一致的结构,也被认为是不一样的结构(1)
- 结构体标记的声明:用于解决在替他地方声明结构体(2)
- 结构体使用 typedef 的方式
- 结构体作为参数(3)
- 结构体作为返回值(4)
// 1
#include <stdio.h>
// 定义仓库中零件信息的结构体
struct
{
// 编号
int number;
// 名称
char name[20];
// 现有数量
int on_hand;
} part1={528,"Disk drive",10};
struct
{
// 编号
int number;
// 名称
char name[20];
// 现有数量
int on_hand;
} part2 = {914,"Printer cable",5};
int main()
{
// 此处报错,因为不是在同一处一起定义的
part1 = part2;
}
// 2
#include <stdio.h>
// 定义仓库中零件信息的结构体
struct part
{
// 编号
int number;
// 名称
char name[20];
// 现有数量
int on_hand;
} part3,part4; // 1. 可以在标记时同时声明变量
int main()
{
// 2. 也可以单独声明变量
struct part part1,part2;
struct part part5;
// 3. 这样在别处声明的同一类型的变量就可以相互赋值了
part5 = part1;
}
// 3
#include <stdio.h>
struct part
{
int number;
char name[20];
int on_hand;
} part1 = {512,"disk driver",100};
void print_part(struct part p);
int main()
{
print_part(part1);
}
void print_part(struct part p)
{
printf("part number:%d\n",p.number);
printf("part name:%d\n",p.name);
printf("on hand:%d\n",p.on_hand);
}
// 输出
part number:512
part name:6487556
on hand:100
// 4
#include <stdio.h>
#include <string.h>
struct part
{
int number;
char name[20];
int on_hand;
} part1;
struct part build_part(int number,const char *name,int on_hand);
int main()
{
part1 = build_part(528,"disk driver",10);
}
struct part build_part(int number,const char *name,int on_hand)
{
struct part p;
p.number = number;
strcpy(p.name,name);
p.on_hand = on_hand;
return p;
}
16.3 数组和结构的嵌套
- 结构体嵌套结构体(1)
- 结构数组(2)
- note:scanf 一个数组元素,如果格式是 &s[0],前面需要加上 & 符号
- 结构数组的初始化(3)
// 1
#include <stdio.h>
struct person
{
int age;
char name[20];
};
struct student
{
struct person sp;
int classes;
};
int main()
{
struct student s1,s2;
printf("输入年龄:");
scanf("%d",&s1.sp.age);
printf("录入年龄:%d",s1.sp.age);
}
// 输出
输入年龄:11
录入年龄:11
// 2
#include <stdio.h>
struct person
{
int age;
char name[20];
};
struct student
{
struct person sp;
int classes;
};
int main()
{
struct student s[5];
printf("输入年龄:");
scanf("%d",&s[0].sp.age);
printf("录入年龄:%d",s[0].sp.age);
}
// 输入
输入年龄:12
录入年龄:12
// 3
struct student s[2] =
{
{{11,"lili"},106},
{{12,"zhangsan"},108}
};
16.4 联合
- 联合的成员共享同一存储空间,且每次只能存储一个成员
- 编译器只为联合中最大的成员分配足够的空间(1)
- 结构体的成员存储在不同的内存中,而联合体存储在同一内存区域,这将导致后赋值的成员覆盖先赋值的成员(2)
- 联合体的初始化只能用于赋值给第一个成员
// 1
#include <stdio.h>
union
{
int i;
float f;
}u;
int main()
{
printf("%d",sizeof(u));
}
// 输出,输出的 float 的大小
4
// 2
#include <stdio.h>
union
{
int i;
float f;
}u;
int main()
{
u.i = 1;
u.f = 1.2;
printf("%d,%f",u.i,u.f);
}
// 输出,可以看到 u.i 的值已经找不到了
1067030938,1.200000
16.5 枚举