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:512part name:6487556on 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 枚举