向函数传递结构体的方式有三种:
1、向函数传递结构体的单个成员:结构体的单个成员作为函数参数,相当于变量在函数之间的传递,仅仅复制单个成员的内容。(很少使用)。
2、用结构体变量作为函数参数,向函数传递结构的完整结构:实际是复制所有结构体成员给函数。调用函数的结果不影响主调函数的结构体成员的值。传递后的值不能改变结构体原始值。
用结构体变量作实参时,采取的是“值传递”方式,将结构体变量所占的内存单元的内容(结构体变量成员列表)全部顺序传递给形参,这里形参也得是结构体变量。
C语言允许对具有相同类型的结构体变量进行整体赋值,在赋值的时候是按照成员变量逐一的进行赋值。
#include <stdio.h>
typedef struct max //定义一个标签为max的结构体
{
int x;
int y;
int z;
}max;
int func(max s) //最大值函数,三目运算符,形参为max类型的s
{
s.z = s.x > s.y ? s.x:s.y;
return s.z;
}
int main()
{
max s = {0, 0 ,0}; //给结构体变量s赋值
s.x= 1; //修改结构体变量s中的成员x变量的值
printf("%d = %d > %d ? %d : %d ",func(s),s.x,s.y,s.x,s.y);
//输出结果 1 = 1 > 0 ? 1:0
}
3、向函数传递结构体变量的首地址:用结构体指针或结构体数组作为函数参数向函数传值,仅仅复制一个地址值。传递后的值可以改变结构体原始值。
当然这里的a -> y = 13;等价于(*a).y =13;
很多人分为这三种,但其实还有一种,就是用结构体变量的引用变量作函数参数,(很少提到,但最好用)
这种传递方式:实参是结构体变量,形参是对应的结构体变量的引用,传递的是地址,因而执行效率与指针差不多一样高。而且更加直观明了,使程序更加简单易懂。
被调函数参数写为接收地址的形参
#include <stdio.h>
typedef struct max
{
int x;
int y;
int z;
}max;
int func(max &a) //看这里,接收结构体变量的地址即可,使用起来和原函数很像
{
a.z = 14;
}
int main()
{
max s = {0, 0 ,0};
printf("%d %d %d\n",s.x,s.y,s.z);
func(s); //直接传递结构体变量
printf("%d %d %d",s.x,s.y,s.z);
}
因为嵌套使用和前面的结构体成员的访问有关,所以放在了最后:
#include <stdio.h>
#include <string.h>
//日程管理
typedef struct date //定义了一个日期结构体,包含年月日三个成员
{
int year;
int mouth;
int day;
}datea;
typedef struct schedule//定义了一个日程结构体,包含日期,和活动两个成员变量
{
datea date;
char activity[200];
}sch;
int main()
{
sch jack; //jack的日程
jack.date.year = 2021; //使用级联运算
jack.date.mouth = 11;
jack.date.day = 11;
strcpy(jack.activity,"Taobao shooping"); //字符串的赋值要使用strcpy
printf("%d %d %d \n%s \n",jack.date.year,jack.date.mouth,jack.date.day,jack.activity);
}
输出结果:
函数调用的情况:
#include <stdio.h>
#include <string.h>
typedef struct date //定义了一个日期结构体,包含年月日三个成员
{
int year;
int mouth;
int day;
}datea;
typedef struct schedule//定义了一个日程结构体,包含日期,和活动两个成员变量
{
datea date;
char activity[200];
}sch;
int Init(sch &jack) //初始化函数
{
jack.date.year = 2021; //使用级联运算
jack.date.mouth = 11;
jack.date.day = 11;
strcpy(jack.activity,"Taobao shooping");
}
int main()
{
sch jack;
Init(jack);
printf("%d %d %d \n%s \n",jack.date.year,jack.date.mouth,jack.date.day,jack.activity);
}
那么最后我们把数组和函数调用结合起来,写一个2个人的日程管理情况,(这里用到结构体数组做函数参数的传递,结构体数组的赋值和访问,结构体嵌套的使用)
#include <stdio.h>
#include <string.h>
typedef struct date //定义了一个日期结构体,包含年月日三个成员
{
int year;
int mouth;
int day;
}datea;
typedef struct schedule//定义了一个日程结构体,包含日期,和活动两个成员变量
{
char name[10];
datea date;
char activity[200];
}sch;
int Init(sch *name) //初始化函数 数组用指针接收
{
strcpy(name[0].name,"jack");
name[0].date.year = 2021; //使用级联运算
name[0].date.mouth = 11;
name[0].date.day = 11;
strcpy(name[0].activity,"Taobao shooping");
strcpy(name[1].name,"Amy");
name[1].date.year=2021;
name[1].date.mouth = 11;
name[1].date.day = 12;
strcpy(name[1].activity,"play piano");
}
int main()
{
sch name[2];
for(int i=0;i<2;i++)
{
Init(name);
printf("%s %d %d %d \n%s \n",name[i].name,name[i].date.year,name[i].date.mouth,name[i].date.day,name[i].activity);
}
}
输出结果:
如果你看到这里,给个赞吧,很认真编辑了的。