电子说
第一种方式“.”引用
第一步:先定义一个结构体
#pragma pack(1) /*1字节对齐*/
typedef struct
{
char xuehao[20]; //学号
char xingming[20]; //姓名
float fenshu; //分数
int age; //年龄
}student_t;
#pragma pack()/*还原默认对齐*/
这里采用的是常用的typedef关键字进行定义结构体类型,可以看到student_t这种数据类型里面有4个成员变量,分别是学号、姓名、分数、年龄,这些成员变量既然是变量就应该满足变量的基本特征,也就是说可以被赋值,可以被引用,下面直接看代码
student_t stu1, stu2; //此时stu1,stu2为student_t结构体类型的变量
strcpy(stu1.xingming, "初出茅庐的小李");//数组变量赋值字符串操作
strcpy(stu1.xuehao, "10086"); //数组变量赋值字符串操作
stu1.fenshu = 99.0; //浮点数赋值操作
stu1.age = 10; //整形数赋值操作
strcpy(stu2.xingming, "张三");
strcpy(stu2.xuehao, "10010");
stu2.fenshu = 89.5;
stu2.age = 12;
//左滑可以查看全部
这里可以看到stu1结构体和stu2结构体的4个成员分别被引用了 引用的格式是:结构体变量名.结构体成员名
第二步:打印观察赋值效果
代码如下:
printf("\\r\\n\\r\\n**********小李的创客实验室**********\\r\\n\\r\\n");
printf("====================================\\r\\n");
printf("stu1的姓名是:%s\\r\\n", stu1.xingming);
printf("stu1的学号是:%s\\r\\n", stu1.xuehao);
printf("stu1的年龄是:%d\\r\\n", stu1.age);
printf("stu1的分数是:%f\\r\\n", stu1.fenshu);
printf("====================================\\r\\n");
printf("stu2的姓名是:%s\\r\\n", stu2.xingming);
printf("stu2的学号是:%s\\r\\n", stu2.xuehao);
printf("stu2的年龄是:%d\\r\\n", stu2.age);
printf("stu2的分数是:%f\\r\\n", stu2.fenshu);
printf("====================================\\r\\n");
//左滑可以查看全部
输出结果如下:
第二种方式“->”引用
下面来看第二种常用的引用方法,这种方法经常用做结构体传参的场合,很多参数需要传递的时候,比如在STM32配置串口波特率、停止位、数据位、校验位、这些参数的时候就会应用到,比较方便只需要一个结构体指针变量就可以访问结构体的各个成员变量,下面直接来看实例
代码如下:
void printf_stu(student_t *stu)
{
printf("stu的姓名是:%s\\r\\n", stu- >xingming);
printf("stu的学号是:%s\\r\\n", stu- >xuehao);
printf("stu的年龄是:%d\\r\\n", stu- >age);
printf("stu的分数是:%f\\r\\n", stu- >fenshu);
}
//左滑可以查看全部
这是一个自定义的打印函数,参数是student_t类型的指针,也就是结构体变量的一个地址,调用如下
printf("====================================\\r\\n");
printf_stu(&stu1);
printf("====================================\\r\\n");
printf_stu(&stu2);
//左滑可以查看全部
观察实验现象
可以看出,通过传入函数不同的参数,就可以得到不同的输出这在很多配置参数的场合就显得非常重要
举例说明:
配置C端口参数就是传入这样一个结构体变量的地址
第三种方式引用
其实这种方式我感觉不常用,但是有助于理解指针变量的真实含义就是指针变量取内容的操作,取内容和取地址是跟指针紧密相关的知识点这里简单说一下,以后有时间我们再来详细探讨这里面的细节。
void printf_stu(student_t *stu)
{
printf("stu的姓名是:%s\\r\\n", stu- >xingming);
printf("stu的学号是:%s\\r\\n", stu- >xuehao);
printf("stu的年龄是:%d\\r\\n", stu- >age);
printf("stu的分数是:%f\\r\\n", stu- >fenshu);
}
printf_stu(&stu1);
void printf_stu2(student_t *stu)
{
printf("stu的姓名是:%s\\r\\n", (*stu).xingming);
printf("stu的学号是:%s\\r\\n", (*stu).xuehao);
printf("stu的年龄是:%d\\r\\n", (*stu).age);
printf("stu的分数是:%f\\r\\n", (*stu).fenshu);
}
//左滑可以查看全部
通过以上对比实验大家可以发现,其实两种写法输出效果是一样的,这就说明了取内容和取地址是互逆的操作。
总结:不管那一种引用方式都是为了应用、各种方式都有自己的特点,根据应用场景灵活运用才是正道,至于第二种和第三种的区别我个人感觉不大,其实我用的最多的还是第一种哈~
全部0条评论
快来发表一下你的评论吧 !