一个函数如何实现return好几个返回值(借鉴学习前辈的文章,链接放文章里了)

25 篇文章 1 订阅
订阅专栏
12 篇文章 0 订阅
订阅专栏


三个方法来源:https://blog.csdn.net/weixin_45863921/article/details/105220460

1.全局变量法(慎用)(宏定义也可以实现)

使用全局变量的原因

由于全局变量的作用域是从变量定义处开始直到程序结束,而对于编写有多个返回值的C语言函数,我们可以考虑把要返回的多个值定义成全局变量。当函数被调用时,全局变量被更改,我们再把更改后的全局变量值应用于主调函数中。函数被调用后被更改后的全局变量值即为函数的数个返回值

代码实例

//实例:自定义一个函数,依次分别返回两个数中较大的和较小的
 
#include <stdio.h>
 

int max = 0;
int min = 0;

void max_min(int x, int y)
{
	max = x;
	min = x;
	max = (x > y) ? x : y;
	min = (x < y) ? x : y;
}

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	max_min(a, b);
	printf("%d %d", max, min);
	return 0;
}

运行结果

在这里插入图片描述

方法分析

我们都知道,设计函数很重要的一点就是高内聚低耦合,函数设计出来最好是一个独立的模块,内部的程序最好与外部减少纠缠,但是这种通过全局变量来实现多个return返回值的方法就严重破坏了函数的独立性,原因很简单,你想,全局变量在整个源程序都是可以使用的,如果你在函数内部使用了这个全局变量,但是这个全局变量也很有可能在其他地方被其他代码给改掉。所以我的建议就是如果整个程序代码比较少的时候可以用用,如果程序很复杂,涉及多个函数多个文件的话,还是考虑一下下面的几种方法

2.数组指针法

使用数组指针法的原因

对于函数参数的传递,我们知道有传值和传址这两种方法。我们来复习一下这两个方法的差异,传值的话,函数参数是形参,形参是实参的一份临时拷贝,对形参的修改不会影响实参;传址的话,我们把实参的地址传过来,函数形参可以通过这个门牌号(地址)找到实参,因此也可以通过这个地址对实参进行修改。因此我们可以在主函数定义一个数组,将需要函数返回的值以变量的形式定义在这个数组里,然后把数组地址传给函数,通过数组地址找到数组并把返回值存放到数组里,这样我们就可以在数组里看到多个返回值了

代码实例

//实例:自定义一个函数,依次分别返回两个数中较大的和较小的
// 
 #include <stdio.h>
 
void max_min(int arr[])
{
	if (arr[1] > arr[0])
	{
		int tmp = 0;
		tmp = arr[1];
		arr[1] = arr[0];
		arr[0] = tmp;
	}
}


int main()
{
	int arr[2] = { 0 };
	int i = 0;
	printf("请输入你要比较的两个数:>\n");
	for (i = 0; i < 2; i++)
	{
		scanf("%d", &arr[i]);
	}
	max_min(arr);
	printf("较大的数是: %d\n", arr[0]);
	printf("较小的数是: %d\n", arr[1]);
	return 0;
}

运行结果

在这里插入图片描述

方法分析

这种方法的缺陷就是要求返回值的类型必须是一致的,如果不一致可以看看第三种方法(第一个方法也可以实现多个返回值类型不一致的函数,但是就是太危险了)

3.结构体指针法

使用结构体指针法的原因

我们能够知道,结构体里能够定义多种类型的数据,但是存值方法却类似数组,所以利用结构体简直就是集上面两种方法之大成(存值形式类似数组的话,也就可以传址给函数,避免出现全局变量的尴尬情况,而结构体内多种数据类型又避免了数组只能存放一种数据类型的尴尬,真的棒!!!)。。但是初学者难以理解结构体这个知识点

代码实例

//实例:自定义一个函数,用户能输入学生的姓名,班级,总成绩和排名,并将这些数据返回给主函数进行调用

#include<stdio.h>
#include<string.h>

struct stu
{
	char name[20];
	int class;
	float score;
	int rank;
};

void scanf1(struct stu* ps1)
{
	char name1[20] = { 0 };
	int class1 = 0;
	float score1 = 0.0f;
	int rank1 = 0;
	scanf("%s%d%f%d", name1, &class1, &score1, &rank1);
	strcpy(ps1->name, name1);
	ps1->class = class1;
	ps1->score = score1;
	ps1->rank = rank1;
}

int main()
{
	struct stu s1;
	scanf1(&s1);
	printf("口腔医学210%d班的%s同学,你的总成绩是%f,在该专业排名第%d", s1.class, s1.name, s1.score, s1.rank);
	return 0;
}

运行结果

在这里插入图片描述

方法分析

这个代码是集1.2两种方法的大成,但是这里难点特别多,比如结构体的定义,结构体的赋值,结构体的引用等等

4.返回型参数法

该方法是练习的时候发现的,我也将那道题和这个方法做了结合,想要详细了解可以去看那篇文章
杨氏矩阵、返回型参数

这个方法的思想就是,在函数参数中多传入两个变量的地址,然后在函数中解引用访问这两个变量,可以把需要返回的值放入这两个变量,因为是传址,因此可以成功接收到。
但是,如果这两个参数是毫无意义的,那我觉得不如就用我之前介绍的三种方式。

这里的px,py就是返回型参数
参入的参数是极其有意义的。一、row、col代表矩阵的行列长度,这正是矩阵需要的。二、row、col都有代表下标的属性(意思是行列和下标都是代表位置的变量,用来接收目标下标也是情理之中)

#include<stdio.h>

void Young_matrix(int arr[3][3], int key, int *px, int *py)
{
	int x = 0;
	int y = *py-1;//(x,y)是初始矩阵右上角元素的下标
	while (x <= *px-1 && y >= 0)
	{
		if (arr[x][y] > key)
		{
			y--;//去掉一列
		}
		else if (arr[x][y] < key)
		{
			x++;//去掉一行
		}
		else
		{
			*px = x;
			*py = y;
			return;
		}
	}
	*px = -1;
	*py = -1;
}

int main()
{
	int arr[3][3] = { 1,2,3,4,5,6,5,7,8 };
	int key = 0;//要寻找的值
	scanf("%d", &key);
	int row = 3;
	int col = 3;
	Young_matrix(arr, key, &row, &col);

	if(-1 == row && -1 == col)
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了,下标是:(%d,%d)\n", row, col);
	}

	return 0;
}

结尾

这里是壮壮的学习之路,感谢大家的浏览与支持

Sprin框架的学习(课时七)SpringAop的学习
qq_56248592的博客
09-09 333
设计模式的本质是面向对象设计原则的实际运用, 是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。 正确使用设计模式具有以下优点: 可以提高程序员的思维能力、编程能力和设计能力。 使程序设计更加标准化、 代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。 使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。 个人总结 增强自己编码的思维能力,以另外的一种思维解决生活中的问题。
d3d透视逆向篇:第8课 通过虚表函数的获取D3D9函数指针
mutashizhe的博客
12-11 1549
本逆向安全章节是我业余之间编写的,也借鉴前辈的经验来给大家做一个简单的文字逆向安全教程,欢迎大家讨论和指正,共同学习。禁止非法用途。教程我从最简单的开始给大家做一个简单的讲解d3d 类的3d游戏和fps游戏黑屏、透视等功能。后面有更多的经验分享给大家。 第8课 通过虚表函数的获取D3D9函数指针 本章教程适合fps射击类游戏。别着急,后面慢慢讲fps游戏。原理和思路更加重要。 1.模块名+偏移...
多个返回值的处理方法
zrh_CSDN的博客
07-07 2163
当需要通过函数调用返回多个的时候,除了通过指针传递的方法,还可以通过结构体。可以声明一个结构体,将所有返回值都作为结构体的成员,这样在函数声明的时候就可以将结构体类型作为函数返回值类型,从而实现返回多个的目的。...
JS中实现函数return多个返回值的实例
10-20
下面小编就为大家带来一篇JS中实现函数return多个返回值的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
函数如何返回多个返回值
最新发布
weixin_56459724的博客
09-12 367
着重利用结构体来返回多个返回值
return如何返回多个
weixin_42654528的博客
02-22 1387
return如何返回多个
c语言||一个函数return好几个?(产生多个返回值
热门推荐
半两八斤的博客
03-31 4万+
c语言||函数产生多个返回值???? 有一天,我正愉悦地写着函数,突然,我想让这个函数返回多个, 一下子懵逼了呀 无奈之下,只好翻阅资料,整理了这篇文章 本文的结构如下: 1.三种函数返回多个返回值的方法: ​     1.全局变量法(慎用) ​     2.数组指针法 ​     3.结构体指针(结构体也是个函数) 2.三种方法的注意点及建议使用场...
return一次性返回多个数据
缘 源 园
02-22 1万+
return特点的总结: 1.当函数执行完return语句以后,表示函数执行结束,return后面的代码不会执行 2.return语句只能返回1次。 return想要返回多个数据,需要结合容器类型使用,把多个返回的数据到容器类型面,返回容器类型的数据即可。 def return_more_value(): # return [1, 2] # return {"num1": 1, "num2:": 2} # return (1, 2) # 返回多个数据的简写方式.
如何让一个函数返回多个
weixin_30760895的博客
05-21 183
有两种方法: 1.使用指针变量声明函数(或者使用数组变量) 2.使用传出参数 第一种方法:函数返回的是一个指针地址(数组地址),这个内存地址有多个变量寄存在面。 这个方法我不太会用,传地址传我常常搞的淅沥糊涂。 第二种方法:我用例子说明。 首先声名一个函数,定义如下 public bool CheckUser(string UserName, out string PassWor...
利用Python把遥感影像的某几个波段合成
weixin_40501429的博客
02-05 5268
刚刚开始想着手学习Python,决定从最基础的读写遥感影像开始。学习借鉴了网上很多前辈们的经验,自己出现了一些小问题写在这,算是记录一下。 这是USGS上下载的一景Landsat8影像,地点在青海。 用ENVI截取了扎陵湖的一部分,真彩色合成图如下: 想利用Python把nir,red,green三个波段合成假彩色,代码如下: import os import numpy as np from osgeo import gdal class IMAGE: # 读图像文件
第九章Java8新增的并发笔记
hankin的博客
06-01 2404
一、原子操作CAS——LongAdder JDK1.8时,java.util.concurrent.atomic包中提供了一个新的原子类:LongAdder。根据Oracle官方文档的介绍,LongAdder在高并发的场景下会比它的前辈——AtomicLong 具有更好的性能,代价是消耗更多的内存空间。AtomicLong是利用了底层的CAS操作来提供并发性的,调用了Unsafe类的getAndA...
罗剑锋的C++实战笔记19-脚本语言:搭建高性能的混合系统
qq_53280238的博客
06-22 882
经过了前面这么多节课的学习,相信你已经认识到了 C++ 的高效、灵活和强大。使用现代特性,再加上标准库和第三方库,C++ 几乎“无所不能”。但是,C++ 也有自己的“阿喀琉斯之踵”,那就是语言复杂、学习曲线陡峭、开发周期长、排错 / 维护成本高。所以,C++ 不能完全适应现在的快速开发和迭代的节奏,最终只能退到后端、底层等领域。要想充分发挥 C++ 的功力,就要辅助其他的语言搭建混合系统,尽量扬长避短,做好那最关键、最核心的部分,这样才能展现出它应有的价
如何让一个函数返回多个返回值
qq_34489443的博客
07-29 4万+
一个题目为例: 要求用户使用一个整数指出自己的身高(单位为英寸),然后将身高转化为英尺和英寸。 方法一: 利用结构体,注意函数定义一定要用结构体来定义 struct trans { int chi; int cun; }; trans transform(int); int main() { using namespace std; int a; cin &gt;&gt;...
一个函数返回多个
u013243314的专栏
05-19 5628
如把多个需要返回作相应的处理后变成一个可以用return语句返回的数据,再在主调函数中拆开返回的数据使之变成几个。   那么当我们希望从一个函数返回多个时,用什么方法去实现比较合理呢? 2方法1:利用全局变量   分析:全局变量作为C语言一个知识点,虽然我们都了解它的特点,但在实际教学过程中应用得并不是很多。由于全局变量的作用域是从定义变量开始直到程序结束,而对于编写有多个返回
函数多个返回值
ayww的博客
12-17 200
函数返回多个参数1 1 std::tuple<int, std::string, bool> func() { return std::make_tuple(123, "567", false); } int main() { auto [v1, v2, v3] = func(); std::cout << v1 << std::endl <&...
如何用return返回多个_强烈安利python实现return返回多个的独家秘笈
weixin_35186171的博客
01-28 5000
今日份小编就为大家分享一篇关于python 实现return返回多个,具有很好的参考价,希望对大家有所帮助。一起跟随小编过来看看吧。函数return 语句只能返回一个,可以是任何类型。因此,我们可以“返回一个 tuple类型,来间接达到返回多个 ”。函数return 语句只能返回一个,可以是任何类型。因此,我们可以“返回一个 tuple类型,来间接达到返回多个 ”。例: x 除...
python- 如何return返回多个
weixin_34087307的博客
08-02 4284
函数return 语句只能返回一个,可以是任何类型。 因此,我们可以“返回一个 tuple类型,来间接达到返回多个 ”。 例:   x 除以 y 的余数与商的函数 def    F1 ( x, y ):          a = x % y          b = (x-a) / y          return ( a,b )     # 也可以写作 return a, b...
函数返回多个
weixin_44351145的博客
11-05 439
1.方法一 利用结构体,注意函数定义一定要用结构体来定义 struct trans { int chi; int cun; }; trans transform(int); int main() { using namespace std; int a; cin >>a; trans b; b = transform(a); cout << b.chi <<" "<<b.cun; while(true) { } } trans tra
关于 return 多个实现
lihang199001的专栏
11-13 713
1使用指针: 1.1返回int数组: #include "stdafx.h" #include #include using namespace std; //使用指针,返回一个填充好的数组; int *c(int a[]); int main() { int q[10]; int *w=c(q); for(int j=0;j<10;j++) cout<<*(w+j)
写文章

热门文章

  • 一个函数如何实现return好几个返回值(借鉴学习前辈的文章,链接放文章里了) 14734
  • c语言printf输出格式(%d %f %e %x) 3717
  • 扫雷小游戏——c语言初学者用尽所学 3228
  • C语言小项目——通讯录高阶(文件管理版) 2046
  • n子棋,你能下赢电脑吗,来玩玩吧 1924

分类专栏

  • 数据结构
  • 数据结构知识点 2篇
  • 数据结构刷题 1篇
  • 数据结构小小项目
  • c语言 25篇
  • C语言知识点 12篇
  • C语言刷题 8篇
  • C语言小小项目 5篇
  • 工具 1篇

最新评论

  • c语言printf输出格式(%d %f %e %x)

    2401_83052026: %e的输出不应该是小数点前一位,小数点后六位,e 后四位包括符号位嘛? 1.123456e+004

  • c语言生成随机数(rand、srand、time)

    ‪‬‎‭‪‎壮壮: 是的,你可以单独弄个测试用例试试看

  • c语言生成随机数(rand、srand、time)

    zyl_718: 也就是说即使srand在循环外,它的值也是持续变化的吗

  • 探索数据结构世界之排序篇章(超级详细,你想看的都有)

    跳动的bit: 排序介绍的很详细,支持大佬

  • c语言生成随机数(rand、srand、time)

    ‪‬‎‭‪‎壮壮: 不会的,因为种子是time,而time是不断在变的呀

大家在看

  • 帝国CMS – AutoTitlePic 自动生成文章标题图片插件
  • 帝国CMS7.0 7.2 7.5微信登录插件

最新文章

  • 探索数据结构世界之排序篇章(超级详细,你想看的都有)
  • 二叉树与递归的相爱相杀
  • C语言,vs各种报错分析(不断更新)
2023年17篇
2022年11篇

目录

目录

评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家清远楼盘玻璃钢卡通雕塑玻璃钢雕塑厂家业务武汉不锈钢马玻璃钢彩绘雕塑厂家校园雕塑玻璃钢呼和浩特校园玻璃钢雕塑生产厂家爬墙熊猫玻璃钢雕塑商场美陈亮化定制天津景观玻璃钢雕塑定做价格南京玻璃钢雕塑生产商大型商场美陈供货商滁州人物玻璃钢雕塑设计金水区玻璃钢广场雕塑铜陵创意玻璃钢雕塑联系方式盐城商场春节美陈广州学校玻璃钢雕塑价位浦口商场美陈布展德州玻璃钢人物雕塑价格范围商业街雕塑手掌玻璃钢雕塑宜宾玻璃钢广场雕塑价格昭通市玻璃钢雕塑如何深圳城市道路玻璃钢花盆玻璃钢雕塑园林景观瀍河玻璃钢雕塑重庆玻璃钢卡通人物雕塑定制玻璃钢羚羊雕塑深圳商场美陈市场价中山玻璃钢雕塑制作厂家商场美陈 美人鱼四川超市商场美陈价格喷泉雕塑鸭子玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化