>点击蓝字,关注我们
往
期
回
顾
从零开始学习C语言的结构体,带你掌握结构体的概念,类型,格式,用法和用途(一)
指针是C语言的灵魂:一篇文章带你掌握指针的基本概念和用法
01
本节重点
C语言结构体(后续)
前提回顾:
上节课已经将一些C语言结构体的基本概念,下面继续说完c语言结构体内容
从零开始学习C语言的结构体,带你掌握结构体的概念,类型,格式,用法和用途(一)
初始化结构体变量
初始化结构体变量的方法是在定义结构体变量的时候,用一对大括号包含结构体成员的初始值,按照结构体成员的顺序依次赋值。初始化结构体变量的格式如下:
例如,初始化一个表示日期的结构体变量,可以写成:
struct date {int year; //年int month; //月int day; //日} d1 = {2020, 12, 25}; //定义并初始化一个date类型的变量d1
复制结构体变量
复制结构体变量的方法是使用赋值运算符(=),将一个结构体变量的值赋给另一个结构体变量。复制结构体变量的格式如下:
这样,结构体变量1的所有成员的值都会被结构体变量2的对应成员的值覆盖。例如,复制一个表示日期的结构体变量,可以写成:
struct date {int year; //年int month; //月int day; //日} d1 = {2020, 12, 25}, d2; //定义两个date类型的变量d1和d2d2 = d1; //将d1的值赋给d2传递结构体变量
传递结构体变量的方法是将结构体变量作为函数的参数或返回值,这样可以在函数之间传递结构体变量的值。
结构体变量可以作为函数的参数进行传递,有两种常见的方式:
1)值传递:将结构体变量的值作为实参传递给形参,这样在函数中对形参的修改不会影响实参。这种方式的缺点是需要对整个结构体做一份拷贝,如果结构体成员很多,会占用较多的内存和时间。值传递的格式是:
void func(struct 结构体名 变量名); //函数声明func(结构体变量); //函数调用2)地址传递:将结构体变量的地址作为实参传递给形参,这样在函数中对形参的修改会影响实参。这种方式的优点是只需要传递一个指针,不需要拷贝整个结构体,节省了内存和时间。地址传递的格式是:
void func(struct 结构体名 *指针名); //函数声明func(&结构体变量); //函数调用一般来说,地址传递比值传递更高效,但也要注意保护实参的数据安全。
实际案例:
例如,定义一个函数,用来计算两个日期之间的天数,并返回一个表示日期的结构体变量,可以写成:
#include <stdio.h>//定义结构体类型struct date { int year; //年 int month; //月 int day; //日};//定义函数,计算两个日期之间的天数//定义函数,计算两个日期之间的天数int days(struct date d1, struct date d2) { int days = 0; //天数 int months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //每个月的天数 //判断是否是闰年,如果是,二月份加一天 if ((d1.year % 4 == 0 && d1.year % 100 != 0) || d1.year % 400 == 0) { months[1]++; } //判断两个日期的先后顺序,如果d1晚于d2,交换两个日期 if (d1.year > d2.year || (d1.year == d2.year && d1.month > d2.month) || (d1.year == d2.year && d1.month == d2.month && d1.day > d2.day)) { struct date temp = d1; d1 = d2; d2 = temp; } //判断两个日期是否在同一年 if (d1.year == d2.year) { //判断两个日期是否在同一月 if (d1.month == d2.month) { //直接计算两个日期的日差 days = d2.day - d1.day; } else { //计算第一个日期到月末的天数 days += months[d1.month - 1] - d1.day; //计算第二个日期到月初的天数 days += d2.day; //计算中间相差的月份的天数 for (int i = d1.month; i < d2.month - 1; i++) { days += months; } } } else { //计算第一个日期到年末的天数 days += months[d1.month - 1] - d1.day; //加上当月剩余的天数 for (int i = d1.month; i < 12; i++) { //加上后面几个月的天数 days += months; } //计算第二个日期到年初的天数 days += d2.day; //加上当月已过的天数 for (int k = 0; k < d2.month - 1; k++) { //加上前面几个月的天数 days += months[k]; } //计算中间相差的年份的天数 for (int j = d1.year + 1; j < d2.year; j++) { //遍历每一年 if ((j % 4 == 0 && j % 100 != 0) || j % 400 == 0) { //判断是否是闰年,如果是,加366天 days += 366; } else { //否则,加365天 days += 365; } } } return days; //返回天数}//定义函数,返回一个表示日期的结构体变量struct date input() { struct date d; //定义一个date类型的变量d printf("请输入年月日,用空格隔开:\n"); scanf("%d %d %d", &d.year, &d.month, &d.day); //输入年月日 return d; //返回d}int main() { struct date d1, d2; //定义两个date类型的变量d1和d2 d1 = input(); //调用input函数,给d1赋值 d2 = input(); //调用input函数,给d2赋值 printf("两个日期之间相差%d天\n", days(d1, d2)); //调用days函数,计算并打印天数 return 0;}
测试结果:
结构体的用途
结构体的用途主要在于可以将一些相关的数据组织成一个整体,方便管理和操作。结构体可以用来表示一些复杂的数据结构,如链表,树,图等,这些数据结构在算法设计和问题求解中有着广泛的应用。结构体也可以用来实现一些面向对象的特性,如封装,继承,多态等,提高代码的可读性和可维护性。
想要学习C语言的朋友可以自己购买下面推荐的c语言基础从入门到精通,内容包含c语言初始到最终实战,附赠视频教学,让你轻松学习C语言。
点赞加关注,学习不迷路
微信公众号|工控小新
EPLAN电气绘图、TIA博图基础 、CAD、C语言教学、单片机基础、三菱PLC ... 每日持续更新中
发现“分享”和“赞”了吗,戳我看看吧
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |