Appearance
C语言结构体和没有方法的类很像, 结构体的成员变量可以是其他结构体.
c
struct address { char city[50]; char street[50]; int postal_code; };
struct person { char name[50]; int age; struct address addr; };初始化
1. 按照成员顺序初始化
c
struct person { char name[20]; int age; float height; };
struct person p1 = {"Tom", 20, 1.75};顺序需要一一对应, 如果编辑器有提示还是不错滴.
2. 指定成员变量的初始化值
c
struct person { char name[20]; int age; float height; };
struct person p1 = {.name = "Tom", .age = 20}; // 指定成员变量的初始化值如果没有指定的话会被自动赋值为 0 或者 NULL.
3. 分别赋值
c
struct person { char name[20]; int age; float height; };
struct person p1;
p1.name = "bob";
p1.age = 20;
p1.height = 175;4. 输入初始化
c
struct CAR { char name[20]; int price; char color[20];} car2;
printf("请输入品牌:");
scanf("%s",car3.name);
printf("请输入单价:");
scanf("%d",&car3.price);
printf("请输入颜色:");
scanf("%s",car3.color);上面四种是上课讲的, 实际上复杂化了, 就记住前三种即可, 4 ~ 6 都是扩展了.
5. 配合 typedef 初始化
其实就是第一种初始化方式, 但是配合 typedef 可以让代码非常简洁.
c
typedef struct { char name[20]; int age; float height; } Person;
Person p1 = {"Tom", 20, 1.75};typedef 的名称可以和结构体的名称一样, 也可以去除结构体的名称, 如上所示.
详细的用法在 typedef 里已经写过了.
结构体指针
[!info] 笔记
指针调用结构体的成员需要使用
->
1. 指向普通变量
c
struct person a={"李四",12,'W'};
struct person *p=&a;2. 指向堆区地址
c
struct person *p1 = (struct person*)malloc(sizeof(struct person));
p1->age = 20;
p1->height = 1.75;
strcpy(p1->name, "Tom");3. 指向数组地址
c
struct person arr[2]={"李四", 12, 'W', "战三", 34, 'M'};
struct person *p=arr;嵌套结构体
c
struct person { struct date birth; char name[20]; };
struct date { int year; int month; int day; };嵌套结构体数组
c
struct car { char color[20], int price; };
struct person { struct car cars[2]; char name[20]; };嵌套共用体
共同体和结构体的声明很像, 但其中的内容只能有一个成员保存, 其占用内存大小是最大成员的大小. 和结构体搭配可以用在可变的属性上
c
struct person {
char name[20];
int age;
union {
int score; // 对应学生
char job[20]; // 对应老师
}
};上面的代码是一个教师和学生共用的结构体, 如果有成绩那么保存的就是学生, 如果有职位那么保存的就是教师.
[!Note] 笔记
如果不对 union 进行取名的话, 就可以直接 person.score 获取到数据, 如果有名字的话就需要 person.unionname.score 这样取得数据.
另外也可以包含之前声明过的共用体 :
c
union Pos {
int score;
char job[20];
};
struct person {
union Pos pos;
};当然这种的调用方法也必须是 per.pos.job .
结构体占用内存大小
结构体可以使用 sizeof运算符 计算其大小, 但是它的大小不是简单的成员元素的大小总和, 它循序一个 结构体字节对齐原则.