[西门子] 从零开始学习C语言的结构体,带你掌握结构体的概念,类型,格式,用法和用途(二

[复制链接]
查看234 | 回复0 | 2024-6-28 07:58:38 | 显示全部楼层 |阅读模式
>点击蓝字,关注我们






从零开始学习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 ... 每日持续更新中

发现“分享”“赞”了吗,戳我看看吧


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则