结构体和数据结构--向函数传递结构体

news2024/9/23 21:29:58

将结构体传给函数的方式有以下三种:

目录

一、用结构体的单个成员作为函数参数,向函数传递结构体的单个成员

二、用结构体变量作函数实参,向函数传递结构体得完整结构

三、用结构体指针或结构体数组作函数参数,向函数传递结构体的地址。


一、用结构体的单个成员作为函数参数,向函数传递结构体的单个成员

        用单个结构体成员作为函数实参,与普通类型的变量作为函数实参没什么区别,都是传值调用,在函数内部对其进行操作,不会引起结构体成员值得变化。

这种向函数体传递结构体得一个成员得方式,很少使用。

二、用结构体变量作函数实参,向函数传递结构体得完整结构

        用结构体变量作函数实参,向函数传递得是结构体得完整结构,即将整个结构体成员得内容复制给被调函数。在函数内可用成员选择运算符引用其结构体成员。因这种传递方式也是传值调用,所以,在函数内对形参结构体成员值得修改,不会影响相应得实参结构体成员。

        当实参和形参是同一种结构体类型时,才可以使用这种方式传递。当函数被调用时,系统为结构体形参变量分配得存储空间得大小由所定义得结构体类型决定。这种传递方式更直观,但因其占用的内存空间比较大,因而时空开销较大。

三、用结构体指针或结构体数组作函数参数,向函数传递结构体的地址。

    (例题1演示作为函数参数,例题2演示作为函数返回值)

         用指向结构体的指针变量或结构体数组作函数实参的实质是向函数传递给结构体的地址,因为是传地址调用,所以在函数内部对形参结构体成员值得修改,将影响到实参结构体成员的值。

        由于仅复制结构体首地址一个值给被调函数,并不是将整个结构体成员的内容复制给被调函数,因此相对于第2种方式而言,这种传递方式效率更高。

例题1:编写程序用于演示结构体变量作函数参数实现传值调用。

#include <stdio.h>

struct date
{
	int year;
	int month;
	int day;
};

void func(struct date p)
{
	p.year=2000;
	p.month=5;
	p.day = 22;
 } 
 

 
int main(void)
{
	struct date d;
	d.year = 1999;
	d.month = 4;
	d.day = 23;
	printf("Before function call:%d/%02d/%02d\n",d.year,d.month,d.day);
	func(d);
	printf("After function call:%d/%02d/%02d\n",d.year,d.month,d.day);
	return 0;
}

可以看出,向函数传递结构体变量时,实际传递给函数的是该结构体变量成员值得副本,这就意味着结构体变量得成员值是不可能在被调函数中被修改的。和其他变量一样,仅当将结构体的地址传递给函数时,结构体变量的成员值才可以在被调函数中被修改。

修改后:

#include <stdio.h>

struct date
{
	int year;
	int month;
	int day;
};



 void func(struct date *p)
{
	p->year=2000;
	p->month=5;
	p->day = 22;
 }
int main(void)
{
	struct date d;
	d.year = 1999;
	d.month = 4;
	d.day = 23;
	printf("Before function call:%d/%02d/%02d\n",d.year,d.month,d.day);
	func(&d);
	printf("After function call:%d/%02d/%02d\n",d.year,d.month,d.day);
	return 0;
}

 

例题2:结构体除了可作为函数参数的类型意外,还可作为函数返回值的类型。

#include <stdio.h>
struct date
{
	int year;
	int month;
	int day;
};

struct date Func(struct date p)
{
	p.year=2000;
	p.month = 5;
	p.day = 29;
	return p;
}

int main(void)
{
	struct date d;
	d.year = 1999;
	d.month = 4;
	d.day  = 23;
	printf("Before function call:%d/%02d/%02d\n",d.year,d.month,d.day);
	d = Func(d);
	printf("After function  call:%d/%02d/%02d\n",d.year,d.month,d.day);
	return 0; 
}
  

例题3:使用结构体数组所函数参数编程并输出计算学生的平均分。

#include <stdio.h>
#define N 30
typedef struct date
{
	int year;
	int month;
	int day;
}DATE;
typedef struct student
{
	long studentID;
	char studentName[10];
	char studentSex;
	DATE birthday;
	int score[4];
}STUDENT;

void InputScore(STUDENT stu[],int n,int m);
void AverScore(STUDENT stu[],float aver[],int n,int m);
void PrintScore(STUDENT stu[],float aver[],int n,int m);
int main(void)
{
	float aver[N];
	STUDENT stu[N];
	int n;
	printf("How many student?");
	scanf("%d",&n);
	InputScore(stu,n,4);
	AverScore(stu,aver,n,4);
	PrintScore(stu,aver,n,4);
	return 0;
}

void InputScore(STUDENT stu[],int n,int m)
{
	int i,j;
	for(i=0;i<n;i++)
	{
		printf("Input record %d:\n",i+1);
		scanf("%ld",&stu[i].studentID);
		scanf("%s",stu[i].studentName);
		scanf(" %c",&stu[i].studentSex);
		scanf("%d",&stu[i].birthday.year);
		scanf("%d",&stu[i].birthday.month);
		scanf("%d",&stu[i].birthday.day);
		for(j=0;j<m;j++)
		{
			scanf("%d",&stu[i].score[j]);
		}
	}
}

void AverScore(STUDENT stu[],float aver[],int n,int m)
{
	int i,j,sum[N];
	for(i=0;i<n;i++)
	{
		sum[i]=0;
		for(j=0;j<m;j++)
		{
			sum[i]=sum[i]+stu[i].score[j];
		}
		aver[i]=(float)sum[i]/m;
	}
}

void PrintScore(STUDENT stu[],float aver[],int n,int m)
{
	int i,j;
	printf("Reaults: \n");
	for(i=0;i<n;i++)
	{
		printf("%10ld%8s%3c%6d/%02d/%02d ",stu[i].studentID,
                                            stu[i].studentName,
                                            stu[i].studentSex,
                                            stu[i].birthday.year,
                                            stu[i].birthday.month,
                                            stu[i].birthday.day);
		for(j=0;j<m;j++)
		{
			printf("%4d",stu[i].score[j]);
		}
		printf("%6.lf\n",aver[i]);
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/713436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

亿发软件:智能制造时代,企业为什么选择量身定制信息化软件系统

在快节奏的市场环境中&#xff0c;每个企业都寻求建立自己的管理模式&#xff0c;这往往成为竞争优势。然而&#xff0c;标准化软件产品的使用有时会扼杀企业管理的个性化&#xff0c;而僵化的制度则阻碍管理升级。此外&#xff0c;单个的部门级软件会造成信息孤岛&#xff0c;…

【电子量产工具】2.输入系统

文章目录 前言一、输入系统分析二、封装输入结构体三、底层 touchscreen四、底层 netinput五、显示管理层六、测试程序测试效果 总结 前言 最近看了 电子量产工具 这个项目&#xff0c;本专栏是对该项目的一个总结。 对于输入系统&#xff0c;这里只介绍 触摸屏线程 和 网络线…

7-WebApis-6

Web APIs - 6 目标&#xff1a;能够利用正则表达式完成小兔鲜注册页面的表单验证&#xff0c;具备常见的表单验证能力 正则表达式综合案例阶段案例 正则表达式 正则表达式&#xff08;Regular Expression是一种字符串匹配的模式&#xff08;规则&#xff09; 使用场景&#…

微信小程序申请

方案说明&#xff1a; 微信小程序申请步骤有两个过程&#xff0c;目前采用的是第二种方案 第一种方案&#xff1a;直接向微信申请微信小程序 第二种方案&#xff1a;先申请公众号后再通过公众号快速注册并申请小程序 无论申请公众号还是小程序都需要微信认证&#xff0c;微…

ubuntu18.04下安装PCL

整体步骤可参考&#xff1a;https://blog.csdn.net/qq_42257666/article/details/124574029 在本人安装过程中&#xff0c;遇到一些问题&#xff0c;做几点说明&#xff1a; 1.在配置VTK的过程中报错如下&#xff1a; 解决方法&#xff1a; sudo apt install libqt5x11extras…

Nginx【Nginx核心指令(rewrite指令、实战rewrite 、if指令、set和break指令】(六)-全面详解(学习总结---从入门到深化)

目录 Nginx核心指令_rewrite指令 Nginx核心指令_实战rewrite Nginx核心指令_if指令 Nginx核心指令_set和break指令 Nginx核心指令_rewrite指令 地址重写与地址转发 地址重写 地址重写是实际上是为了实现址标准化&#xff0c;就像访问www.baidu.cn可 以出现www.baidu.com的…

阿里云企业邮箱标准版用户数功能说明

阿里云企业邮箱标准版不同用户数费用表&#xff0c;标准版企业邮箱不限制账号容量、20GB共享网盘容量、5GB个人网盘容量&#xff0c;默认5个账号数540元一年&#xff0c;原价是600元一年&#xff0c;年付9折、多年付8折&#xff0c;阿里云百科分享企业邮箱标准版不同账号数收费…

软件测试技能,JMeter压力测试教程,请求body自动签名带上sign参数(二十一)

一、前言 接口请求body带有sign签名参数&#xff0c;sign签名是根据请求body除去sign本身参数后&#xff0c;拼接请求参数最后md5加密生成的 使用 jmeter 测试接口&#xff0c;我们希望在请求之前修改 post body 里面的 sign 参数的值为签名的值 二、sign签名 签名一篇的实…

Alibaba Sentinel | 熔断规则详解

文章目录 简介熔断策略-慢调用比例结论&#xff1a;流程图&#xff1a;熔断结果详细解释 熔断策略-异常比例结论&#xff1a;详细解释 熔断策略-异常数结论&#xff1a;详细解释 统计异常数、比例的方法编码加注解RuntimeException 总结 简介 熔断是一种保护机制&#xff0c;用…

Redis持久化(RDB、AOF)

Redis持久化&#xff08;RDB、AOF&#xff09; 一、Redis高可用二、Redis持久化三、Redis的RDB持久化1、触发条件1.1 手动触发1.2 自动触发1.3 其它自动触发机制 2、执行流程3、启动时加载RED文件(恢复) 四、Redis的AOF持久化1、开启AOF2、执行流程2.1 命令追加&#xff08;app…

杂记:逆向一块FPGA核心板

最近太热了&#xff0c;实在无心看书。阵列书丢一边看不进去&#xff0c;还买了几本统计信号的甚至都没开始看&#xff08;笑&#xff09;&#xff0c;躺在床上玩玩手机摆烂&#xff0c;看到某黄色APP上有老板卖拆机的板子&#xff0c;价格美丽&#xff0c;美中不足的是没有资料…

JavaFX布局详解与代码实例

JavaFX布局详解与代码实例 一、JavaFX布局的原理1.1 JavaFX布局容器1.2 布局约束 二、常用JavaFX布局2.1 VBox和HBox布局2.2 GridPane布局2.3 BorderPane布局 三、JavaFX布局代码实例四、总结与展望 正文&#xff1a; 引言&#xff1a; JavaFX是一种功能强大的用户界面&#xf…

SFP6012-ASEMI代理MHCHXM(海矽美)二极管SFP6012

编辑&#xff1a;ll SFP6012-ASEMI代理MHCHXM&#xff08;海矽美&#xff09;二极管SFP6012 型号&#xff1a;SFP6012 品牌&#xff1a;MHCHXM&#xff08;海矽美&#xff09; 封装&#xff1a;TO-247AB 恢复时间&#xff1a;≤75ns 正向电流&#xff1a;30A 反向耐压&a…

Excel表格转换

原始数据 1部 2部 3部 4部 5部 6部 7部 8部 9部 郈思 王瑾 郈思 许嘉 郈思 施眉 郈思 王瑾 郈思 许嘉 郈思 许嘉 吕倩倩 孙帮菊 夏侯瑾 孙帮菊 吕倩倩 孙痴梦 孙帮菊 姜佳 王瑾 孙痴梦 王瑾 许嘉 施眉 施眉 杨婕 施眉 施眉 孙帮菊 杨孝洁 施眉 吕倩倩 孙痴梦 郈思 夏侯瑾 李文…

NR 吞吐量测试

前言 参考文档&#xff1a; 5G NR TBS (Transport Block size) Calculator | 5G-Tools.com 5G NR Transport Block Size (TBS) Calculation - Techplayon 5G MCS _ 搜索结果_哔哩哔哩_Bilibili 4/5G无线资源和数据调度流程:CQI上报、基站AMC调度、调度信息DCI下发、CQI到MCS的对…

网络控制地址转换管理技术

网络控制&地址转换&管理技术 一、网络控制技术ACL1.1、ACL应用场景1.2、ACL分类1.3、ACL规则1.4、基本ACL配置1.5、高级ACL配置1.6、总结 二、网络地址转换NAT2.1、NAT应用场景2.2、静态NAT2.3、静态NAT配置2.4、动态NAT2.5、动态NAT配置12.6、动态NAT配置22.7、NAPT2.…

【C语言督学训练营 第十六天】考研中常考的排序大题(上)---- 冒泡排序、插入排序、快速排序

文章目录 前言经典的冒泡插入排序快速排序 前言 今天要介绍的部分是排序算法&#xff0c;在很久很久之前学习过十大排序&#xff0c;当时自我感觉非常良好&#xff0c;知道今天才知道我认为的大错特错。有些排序算法会考代码题&#xff0c;有些只会考小题只需要理解思想即可&a…

火山引擎DataLeap数据质量解决方案和最佳实践(二):解决方案

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 DataLeap流批数据质量解决方案 产品功能架构 火山引擎DataLeap流批数据质量解决方案有 4 个大的功能&#xff1a; 离线数据质量监控&#xff1a;解决批和微批监控…

Spring Boot 中的 CD 工具

Spring Boot 中的 CD 工具 在现代软件开发中&#xff0c;持续交付&#xff08;Continuous Delivery&#xff0c;简称 CD&#xff09;已经成为了一个非常重要的开发模式。CD 工具可以帮助我们自动化构建、测试、部署和发布软件&#xff0c;提高软件交付的速度和质量。在 Spring…

接口增量改动,研发经常忘通知测试,如何解决?

不知道大家有没有同感&#xff0c;做接口测试麻烦的不是测试本身&#xff0c;而是接口它会变&#xff0c;更麻烦的不是接口变了&#xff0c;而是它变了而你不知道。等到你测完&#xff0c;开发才悠悠跟你说 ——“那个接口我改了点东西&#xff0c;你再看一眼哈”。 我那是看一…