目录
1 结构体
结构体(struct): C/C++中一种用户自定义的复合数据类型,允许将多个不同类型的变量组合成一个整体,类似于Python、Java中的类。
格式:
struct 可选标记{
成员1;
成员2;
...
}结构变量;
1.1 结构声明
结构声明:一种用户自定义的数据类型,用于将多个不同类型的数据组合成一个逻辑单元;结构声明不会创建实际的数据对象,只是描述了该对象由什么组成;结构声明也可以称为模板。
示例1:
/*people为该结构体类型名,也称people结构布局*/
struct people {
char name[20];
float height;
float weight;
int age;
};
1.2 结构体的组成
结构体的组成:在示例1中,跟在关键字struct后的people是一个可选标记,也可以认为是这个结构体的名字,但是这个名字是可选的(也就是说我可以不给它取名字,如示例4);随后“{}”中的内容包含{}称为结构,“;”表明一个结构体的声明结束。
1.3 结构的成员
结构的成员:在结构中的char name[20]、float height、float weight和int age都称为这个结构的成员或字段。
示例2:
/*people为该结构体类型名,也称people结构布局*/
struct people {
char name[20];
float height;
float weight;
int age;
}xiaoming; //xiaoming为people结构布局的结构变量
1.4 结构变量
结构变量:在示例2中,声明的最后一排“}”后的xiaoming就是一个使用people结构布局的结构变量。
示例3:
struct people xiaoming; //等同于示例2
对比示例2和示例3,其实我们可以省略示例2中的people标记(如示例4),但是这种写法不适合需要多次使用people结构布局的情况(也就是说在程序中仅使用一两次该模板时可以使用示例4写法)。
示例4:
struct{
char name[20];
float height;
float weight;
int age;
}xiaoming;
示例5:
#include <stdio.h>
#include <string.h>
/*people为该结构体类型名,也称people结构布局*/
struct people{
char name[20];
float height;
float weight;
int age;
};
int main(void) {
struct people xiaoming;/*声明xiaoming为一个使用people结构布局的结构变量*/
struct people xiaogang;/*声明xiaogang为一个使用people结构布局的结构变量*/
strcpy(xiaoming.name, "小明");
xiaoming.height = 175.5;
xiaoming.weight = 65.5;
xiaoming.age = 25;
strcpy(xiaogang.name, "小刚");
xiaogang.height = 170.5;
xiaogang.weight = 62.5;
xiaogang.age = 23;
xiaogang.age = 24; //覆盖23,最终打印值为24
printf("姓名:%s\n身高:%.2f cm\n体重:%.2f kg\n年龄:%d 岁\n\n", xiaoming.name, xiaoming.height, xiaoming.weight, xiaoming.age);
printf("姓名:%s\n身高:%.2f cm\n体重:%.2f kg\n年龄:%d 岁 \n", xiaogang.name, xiaogang.height, xiaogang.weight, xiaogang.age);
return 0;
}
运行结果:
姓名:小明
身高:175.50 cm
体重:65.50 kg
年龄:25 岁
姓名:小刚
身高:170.50 cm
体重:62.50 kg
年龄:24 岁
从示例5来看,直接使用结构体类型名people声明了两个结构变量,缩短了代码量。
2 运算符“.”
运算符“.”:可以直接在结构变量后使用“.”引出结构成员为其赋值;如果要重新赋成员值,可以再次通过“.”的方法覆盖前一次的赋值,其方法同变量相同。
3 typedef在结构体中的应用
typedef:为现有类型定义一个新的别名,用于增强代码可读性和可维护性。
示例6:
#include <stdio.h>
#include <string.h>
typedef struct{
char name[20];
float height;
float weight;
int age;
}People; //People是结构体的别名
int main(void) {
People xiaoming; /*声明一个People类型的结构变量 xiaoming*/
strcpy(xiaoming.name, "小明");
xiaoming.height = 175.5;
xiaoming.weight = 65.5;
xiaoming.age = 25;
printf("姓名:%s\n身高:%.2f cm\n体重:%.2f kg\n年龄:%d 岁\n\n", xiaoming.name, xiaoming.height, xiaoming.weight, xiaoming.age);
return 0;
}
运行结果:
姓名:小明
身高:175.50 cm
体重:65.50 kg
年龄:25 岁
在示例6中,typedef其实也是同上期(C语言/const、#define和typedef)讲到的使用方法一样,只是将用户自定义的结构体作为了原类型为其取了一个别名“People”,这样就可以通过“People 结构变量”的方式声明结构变量了,其运行结果同示例5相同,也可以使用该方式声明多个结构变量。
扩展:typedef在结构体中的应用也常用于stm32外设模块初始化,例如我们熟悉的GPIO_InitTypeDef、USART_InitTypeDef、TIM_OCInitTypeDef等。
注:以上内容仅个人理解,不具备唯一性和绝对正确性,仅供参考。