C语言一个函数如何实现好几个return返回值

目录
  • 1.全局变量法(慎用)(宏定义也可以实现)
    • 方法分析
  • 2.数组指针法
  • 3.结构体指针法
    • 方法分析
  • 结尾

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两种方法的大成,但是这里难点特别多,比如结构体的定义,结构体的赋值,结构体的引用等等

结尾

到此这篇关于C语言一个函数如何实现好几个return返回值的文章就介绍到这了,更多相关C语言 return返回值内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解C语言中return返回函数局部变量的问题

    目录 return返回栈区局部变量的指针 return返回栈区局部的临时变量 return只读数据段和static数据 在计算机中,释放空间并不需要将空间中的内容全部置成0或者1,而是只要设置这一块空间的数据无效即可.比如在下载文件时需要花很长时间,但是删除文件却只要几秒钟,这是因为操作系统只是把文件标识(文件头链接)删掉了,文件原文还保留着,我们没了文件标识就找不到这个文件了.所以删除后的文件,还可以用特殊的办法被找回来. 这也就意味着,当函数结束调用的时候,函数中的局部变量实际上还是在的,只

  • C语言一个函数如何实现好几个return返回值

    目录 1.全局变量法(慎用)(宏定义也可以实现) 方法分析 2.数组指针法 3.结构体指针法 方法分析 结尾 1.全局变量法(慎用)(宏定义也可以实现) 使用全局变量的原因 由于全局变量的作用域是从变量定义处开始直到程序结束,而对于编写有多个返回值的C语言函数,我们可以考虑把要返回的多个值定义成全局变量.当函数被调用时,全局变量被更改,我们再把更改后的全局变量值应用于主调函数中.函数被调用后被更改后的全局变量值即为函数的数个返回值 //实例:自定义一个函数,依次分别返回两个数中较大的和较小的 #

  • 详解C语言之函数

    目录 函数的调用 函数调用方式 函数嵌套调用 递归调用 内部函数与外部函数 内部函数 外部函数 局部变量与全局变量 局部变量 全局变量 总结 函数的调用 函数调用方式 函数语句调用 函数表达式调用 函数参数调用 sum(); //函数语句调用 result = average * sum(a); //函数表达式调用 此时函数名出现在表达式中,其返回值将作为表达式的算数参与计算. result = sum(sum1(a)); //函数参数调用 此时函数名出现在另一个函数的参数中,其返回值将作为实参

  • 分析C语言一个简单程序

    首先给大家一个简单的例子,让读者有个整体的认识,代码如下: #include <stdio.h> int main() { puts("我们"); return 0; } 函数的概念 先来看第4行代码,这行代码会在显示器上输出"我们".前面我们已经讲过,puts 后面要带( ),字符串也要放在( )中. 在C语言中,有的语句使用时不能带括号,有的语句必须带括号.带括号的称为函数(Function) . C语言提供了很多功能,例如输入输出.获得日期时间.文

  • 关于C语言qsort函数详解

    目录 C语言qsort函数详解 一.qsort函数是什么 二.使用qsort排序-以升序为例 1.整形数组排序 2.字符数组排序 3.字符指针数组排序 4.结构体数组排序 5.浮点型数组排序 三.使用冒泡排序思想模拟实现qsort函数 1.什么是冒泡排序 2.冒泡排序代码 3. 使用冒泡排序思想模拟实现qsort函数 C语言qsort函数详解 一.qsort函数是什么 我们可以使用  搜索库函数网址或者MSDN软件进行查找. qsort()函数:快速排序的函数  -引用stdlib.h头文件 参

  • C语言深入讲解之从函数栈帧角度理解return关键字

    目录 初识函数栈帧 return 个人总结环节 初识函数栈帧 如上图可见,函数在被调用的时候会现在栈上开辟一个空间,我们称之为栈帧,之后函数内部的变量在这块区域进行空间开辟. 但是函数在调用的时候,怎么知道需要开辟多大空间呢??? void func() { int a, b; double c, d, e; } 按照示例代码,会先对需要的内存空间大小进行预估,然后进行空间开辟. 函数返回时,栈帧会被释放,但是,虽然栈帧被释放,里面的内容是不会被清空的,下面通过以下的例子进行分析. #inclu

  • C语言浅析函数的用法

    目录 问题引入 函数 C语言中函数的语法形式 问题 例子 函数的调用过程 函数声明 变量声明 数组声明 问题引入 有时候,我们经常需要在一个程序中,对一个数组进行 键盘输入,打印数组元素值. 有些代码块,功能是相同的,只有数组名和元素个数等参数不一样, 代码形式是一样的,对于同一功能而不同参数的代码块,那么咱就可以 将其封装成一个函数,如果您需要用到这样的功能或者代码块,那么我们 就不需要重复的去写代码块,我们只需要调用这个函数. 函数 函数是完成某个功能的指令序列的封装. 函数有什么特点: 相

  • Python定义一个函数的方法

    Python函数的定义 定义函数,也就是创建一个函数,可以理解为创建一个具有某些用途的工具.定义函数需要用 def 关键字实现,具体的语法格式如下: def 函数名(形参列表): //由零条到多条可执行语句组成的代码块 [return [返回值]] 其中,用 [] 括起来的为可选择部分,即可以使用,也可以省略. 此格式中,各部分参数的含义如下: 函数名:从语法角度来看,函数名只要是一个合法的标识符即可:从程序的可读性角度来看,函数名应该由一个或多个有意义的单词连缀而成,每个单词的字母全部小写,单

  • C语言的函数概念与规则你了解吗

    目录 一.函数概念 1.传入参数 2.返回值 二.函数参数 三.指针函数-函数名指针化 1.指针指向其他函数的函数名(标签)效果 2.指针指向其他函数的地址效果 3.通过二级指针,将一组函数线性化 四.函数值传递和址传递 五.函数连续空间的传递 1.结构体(变量) 2.数组(标签) 3.连续空间的只读 六.函数返回值 总结 一.函数概念 函数三要素 int fun(int,int,char){xxx} 函数名 (地址)输入参数输出参数 1.传入参数 实参: 调用时传入的具体值 形参: 函数内部接

  • 详细理解函C语言的函数栈帧

    目录 一.函数栈帧的创建 1.寄存器 2.函数栈帧 3.函数中调用函数 二.函数栈帧的销毁 总结 一.函数栈帧的创建 1.寄存器 一般来说,计算机中的寄存器有六种 分别是:eax, ebx, ecx,edx,ebp,esp 而ebp,esp这两个寄存器中存放的是地址,与此同时,这两个地址是来维护函数栈帧的. 2.函数栈帧 每一个函数的调用,都需要在栈区为其开辟一个空间,这块为其开辟的空间就是函数栈帧. ebp:栈底指针 esp:栈顶指针 对于栈这种数据结构一共有两种栈操作 1.pop 出栈 2.

  • linux shell自定义函数(定义、返回值、变量作用域)介绍

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带function fun() 定义,也可以直接fun() 定义,不带任何参数. 2.参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值. retu

随机推荐