向函数传递结构的三种方式

您所在的位置:网站首页 结构体里写函数 向函数传递结构的三种方式

向函数传递结构的三种方式

2024-07-10 17:13| 来源: 网络整理| 查看: 265

向函数传递结构的三种方式

零、写在前面 在程序设计的过程当中,我们经常会涉及到选择数据的类型,在很多情况下,单单是普通的变量和数组并不足以满足我们的需求,这时候,C语言为我们提供了一种计较好用的数据类型——结构体。

结构体给了我们更加灵活的操作空间,但是如何对于这些结构体的信息进行操作,这就涉及到结构体与函数之间的交互了。以下我小结平日里学习到的三种向函数传递结构的方式。 一、传递结构成员 有时候我们并不需要对于结构体的全体成员进行访问,而只需要单个的或者个别几个的成员便足矣。这时候我们只需要将结构体的部分成员对函数及逆行传参即可。以下是实验代码

#include struct person { char name[10]; //成员姓名 char sex; //成员性别 double salary; //平日工资 double extra_gains; //外快收入 }; double sum(double x,double y) { return(x + y); } int main() { struct person Zhangsan = { "张三", 'm', 10000, //张三日常划水的工资收入 10000000, //法外狂徒的外快收入 } printf("张三一个月的收入有%.2f元\n",sum(Zhangsan.salary,Zhangsan.extra_gains)); return 0; }

以下是程序运行结果: 在这里插入图片描述 二、传递结构 当然,如果我不止是想调用单个成员,而是希望能够更加方便地对整个结构体进行操作,我们能不能将整个结构体都传入呢? 在现行的C语言标准下,是可以的! 我们来对上面的函数进行一次改下,实验代码如下:

#include struct person { char name[10]; //成员姓名 char sex; //成员性别 double salary; //平日工资 double extra_gains; //外快收入 }; double sum(struct person who) { return(who.salary + who.extra_gains); } int main() { struct person Zhangsan = { "张三", 'm', 10000, //张三日常划水的工资收入 10000000, //法外狂徒的外快收入 }; printf("张三一个月的收入有%.2f元\n", sum(Zhangsan)); return 0; }

以下是实验结果截图 在这里插入图片描述 在这种情况下,实际上是为结构体创造了一个名为“who”的自动结构体变量,然后将结构体各个成员变量初始化为Zhangsan对应变量成员的副本。因此,通过该函数后变化的只是结构体的副本,而非结构体本身。 我们对以上的实验代码再进一步改写以做说明。

#include struct person { char name[10]; //成员姓名 char sex; //成员性别 double salary; //平日工资 double extra_gains; //外快收入 }; double sum(struct person who) { who.extra_gains += who.salary; return( who.extra_gains); } int main() { struct person Zhangsan = { "张三", 'm', 20000, //张三日常划水的工资收入 10000000, //法外狂徒的外快收入 }; printf("张三一个月的收入有%.2f元\n", sum(Zhangsan)); printf("此时Zhangsan的extra成员的值为: %f\n", Zhangsan.extra_gains); return 0; }

运行的结果如下:

在这里插入图片描述 我们从运行结果可以看到,虽然在求和函数中对extra成员进行了操作,但是再其后的打印显示中其并未发生改变,说明函数是单独为Zhangsan结构体创建了一个副本,而不是对其本身进行操作。 因此,传递结构体本身有两个特点:

1.传递进入函数的一整个结构体,需要创建的副本有时候内存会比较大,因此在一开始的C语言标准中,并不允许将结构体传递进入函数当中,当然,随着计算机的发展,在现行的标准当中已经允许我们这么操作了。 2.进入函数的结构体本身变量的值并不会改变,改变的只是副本的值,如果需要改变原本结构体的值,可能还需要对结构体进行传参的操作。

三、传递结构的地址 那么有没有办法不用传那么大内存的结构体,同时也能对结构体本身的值进行修改呢?方法还是有的,那就是传递结构的地址,也就是将指向结构体的指针作为参数传入到函数当中,由于指针本身只占有4个字节,内存较小,同时也能对结构体本身进行修改。 实验代码如下:

#include struct person { char name[10]; //成员姓名 char sex; //成员性别 double salary; //平日工资 double extra_gains; //外快收入 }; double sum(struct person *who) //将指针作为参数 { who->extra_gains += who->salary; return( who->extra_gains); } int main() { struct person Zhangsan = { "张三", 'm', 20000, //张三日常划水的工资收入 10000000, //法外狂徒的外快收入 }; printf("张三一个月的收入有%.2f元\n", sum(&Zhangsan)); //将地址传入函数当中 printf("此时Zhangsan的extra成员的值为: %.2f\n", Zhangsan.extra_gains); return 0; }

实验结果如下: 在这里插入图片描述 我们可以看到,Zhangsan结构体的extra成员的值被修改了。因此,也可以看到传递结构体地址有以下三个特点:

1.传入的参数内存小。传递地址只需要4个字节的指针即可,不需要像方法二一样将整个结构体的副本传入,节省了内存空间 2.函数对原始结构体进行计算。与创建副本不同,该方法直接传递结构体的地址,(如代码中的sun(&Zhangsan))因此是对结构体本身进行操作,虽然在该演示中只是对结构体的部分变量进行了修改,但函数其本身是可以访问结构体的全体成员的。 3.函数通过"->"运算符获取相关成员的值,而不是像结构体通过“.”来获取



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3