

一个函数如何实现return好几个返回值
source link: https://blog.51cto.com/u_15558033/5610680
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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两种方法的大成,但是这里难点特别多,比如结构体的定义,结构体的赋值,结构体的引用等等
Recommend
-
67
巴菲特说能跑赢大盘指数的人,他执导的不超过十个,为啥集思路上就有好几个啊? - **他在long bets上和人打了一个赌,十年内 5支FOF的组合跑不赢标普500,巴菲特赢了。原文:如果A组(主动投资者)和B组(被动投资者)构成总体投资市场,而且B组扣除成本前的投资收...
-
37
高铁“霸座男”孙博士还有这事儿呢?网友私信:2016年在北京海淀,孙博士伪造房东委托书,把租来的房又租给了好几个租客,拿了租客们的钱,也不给房东交房租,玩儿人间蒸发。。。导致房东直接找到租客们要钱,租客们最后费尽千辛万苦找到孙博士的家,把...
-
49
问与答 - @runnerlee - 进公司两个多月, 已经看到好几个老员工用别人的简历当草稿纸. 今天开完会出来看到几个人站着讨论问题, 其中一个人就拿着一份别人的简历在背面画示意图...唉, 感觉非常不尊重人.
-
34
好几个帖聊计划生育,说说我知道的不一样的故事 - 早上闲着看到大家好几个帖子讨论人口,计生问题,勾起了我的回忆,说一下我知道的我老家这边当年计划生育发生的那些事吧,现在说起像笑话,背后都是当事人的血泪。 山东一个小镇,现在想想当年计划生...
-
26
前不久,搜狐董事局主席兼CEO张朝阳在接受国内媒体采访时表示,自己学习了一种新的睡眠法,每天睡4个小时,效果特别好,还建议大家都试一试。此言一出立即引发网友热议。对于大家已经固有的“7-8小时才能睡好”的认知,每天只睡4个小时无异于“自杀”。
-
7
如果一个C++函数的返回值是一个函数指针。2016年3月3日函数指针,顾名思义,是指向函数入口的指针。C++的指针非常灵活,同时也非常让人头疼,没有Python的函数那么容易理解(虽然好像Python的高阶函数也不好理解)。函数指针作...
-
8
微信搞了一个“深度清理” 能帮你省出好几个G 2021年10月16日 00:31 21945 次阅读 稿源:差评 0 条...
-
9
阅读时间大约8分钟(2926字) ...
-
5
V2EX › Go 编程语言 golang 一个函数返回不同的结构体有比较优雅的实现吗 evan0724
-
12
为什么 JS 中用函数返回值不能实现 深拷贝(为什么返回引用类型不是一个独立的内存地址)?如图,obj a 传递进去为什么返回的还是对 a 的引用,js 的函数返回值不是一个新值吗? [图片] 补充下问题,我对问题描述的不是很充分,说...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK