初识联合体
“联合体”也称之为“共用体”
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct S {
int n1;
char c;
int n2;
};
union U {
int n1;
char c;
int n2;
};
int main() {
struct S s;
union U u;
printf("结构体的大小:%d\n",sizeof(s));
printf("联合体的大小:%d\n",sizeof(u));
s.n1 = 10;
s.n2 = 20;
s.c = 'a';
printf("结构体n1地址:%p %d\n",&s.n1,s.n1);
printf("结构体c地址 :%p %d\n",&s.c,s.c);
printf("结构体n2地址:%p %d\n",&s.n2,s.n2);
u.n1 = 10;
u.n2 = 20;
u.c = 'a';
// 注意:共用体数据会被覆盖,且地址相同
printf("联合体n1地址:%p %d\n",&u.n1,u.n1);
printf("联合体c地址 :%p %d\n",&u.c,u.c);
printf("联合体n2地址:%p %d\n",&u.n2,u.n2);
return 0;
}
联合体应用 —— 校园信息端
问题:有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、职业﹑班级。教师的数据包括:姓名、职业、职务。要求用同一个表格来处理。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Person {
char name[12];
char zhiYe; // 职业
union {
int classNum;
char sbj[12]; // 学科
} msg;
};
int main() {
int i;
struct Person per[2];
for(i=0; i<2; i++) {
printf("老师输入t,学生输入s\n");
scanf("%c",&per[i].zhiYe);
if(per[i].zhiYe=='s') {
printf("请输入学生的姓名:");
scanf("%s",per[i].name);
printf("请输入学生的班级:");
scanf("%d",&per[i].msg.classNum);
} else {
printf("请输入老师的姓名:");
scanf("%s",per[i].name);
printf("请输入老师的学科:");
scanf("%s",per[i].msg.sbj);
}
getchar();
}
for(i=0; i<2; i++) {
if(per[i].zhiYe=='s') {
printf("请输入学生的姓名:%s 班级:%d\n",per[i].name,per[i].msg.classNum);
} else {
printf("请输入老师的姓名:%s 学科:%s\n",per[i].name,per[i].msg.sbj);
}
}
return 0;
}
初识枚举
#include<stdio.h>
// 定义枚举类型,元素不能重复
enum Data {one,two,three,four,five,six};
int main() {
enum Data d;
d = one;
// 输出索引
printf("d = %d\n",d);
return 0;
}
初始typedef
#include<stdio.h>
struct Test{
int data1;
int data2;
};
// 将结构体类型简写为 T
typedef struct Test T;
// Demo相当于类
typedef struct {
int data1;
int data2;
}Demo;
// 将int型简写为 u8
typedef int u8;
int main() {
T t;
t.data1 = 10;
printf("data1 = %d\n",t.data1);
// demo 相当于 对象
Demo demo;
demo.data1 = 100;
printf("data1 = %d\n",demo.data1);
u8 data = 99;
printf("data = %d\n",data);
return 0;
}