当我们在处理一个数组的时候常常会碰到这样的问题:输入一个数组,和数组的一个元素,返回该元素所在行数和列数。这样就需要返回多组两个值,且组数不定。上述类型的函数在c语言程序里面存在两个问题。第一,函数只能返回一个值(指针);第二,若以指针返回值,则不确定指针所指的内存大小。以下先分别解决这两个问题,之后综合考虑。

1返回多个值的函数

1.1采用指针参量记录值

不用函数的返回值,直接用指针来处理。在函数的输入项里加入一个指针,用来保存记录多个值。如下所示,a[N][M]为要处理的数组,s为要找的数,指针c则记录值,并传回原函数。

  1 int find_num1_1(int a[N][M],int s,int *c)
2 {
3 int i,j;
4 for(i=0;i<N;i++)
5 for(j=0;j<M;j++)
6 if(a[i][j]==s)
7 {
8 c[0]=i;c[1]=j;
9 return 1;
10 }
11 return 0;
12 }

1.2采用函数返回指针

可以直接定义一个返回指针的函数,将指针返回,再经指针取到所需要的值。如下,函数返回一个指针,用指针记录需要输出的结果。

  1 int *find_num1_2(int a[N][M],int s)
2 {
3 int *co;
4 int i,j;
5
6 co=(int *)malloc(2*sizeof(int));
7 for(i=0;i<N;i++)
8 for(j=0;j<M;j++)
9 if(a[i][j]==s)
10 {
11 co[0]=i;co[1]=j;
12 return co;
13 }
14 free(co);
15 co=NULL;
16 return co;
17 }

但这里有一个问题,若找到了s在a中对应的行和列,前面用mallloc所分配的内存区域就不能得到释放,从而浪费内存。

2返回动态指针

因为数组中的值相同的数目不确定性,用大的数组太浪费内存,所以要采用动态内存的办法。如上相同对应也有两种传回的办法,但这里我只是提到采用指针参量记录值的办法来返回动态指针。这里我们需要注意的是,在为一个指针分配内存的时候,只能进行一次分配(这句话我不太确定,希望有知道的看客们能提供一些指导)。于此,我们必须首先要定义一个函数来返回相同项目的个数,之后才能对其分配内存。函数如下:

  1 int find_num2(int a[N][M],int s, int (*c)[2])
2 {
3 int i,j,n=0;
4 for(i=0;i<N;i++)
5 for(j=0;j<M;j++)
6 if(a[i][j]==s)
7 {
8 c[n][0]=i,c[n][1]=j;
9 n++;
10 }
11 return n;
12 }
13 int same_num(int a[N][N],int s)
14 {
15 int i,j,n=0;
16 for(i=0;i<N;i++)
17 for(j=0;j<M;j++)
18 if(a[i][j]==s)
19 ++n;
20 return n;
21 }

内存分配在上级函数中,这样就比较容易释放内存。

  1     n=same_num(a,s);
2 cc=(int (*)[2])malloc(n*2*sizeof(int));
3 if(find_num2(a,s,cc)!=0)
4 while(n--)
5 printf("number is in the (%d,%d)\n",cc[n][0],cc[n][1]);
6 else
7 printf("can't find it\n");
8 free(cc);

这样就能完美地实现要求,且输出的数据可用于其他函数处理。

完整的代码详见:https://github.com/elike-ypq/c_and_cplusplus_study/blob/master/laboratory/multireturn.c

函数返回多个值(c/c++)的更多相关文章

  1. c,c++函数返回多个值的方法

    最近遇到一个问题,需要通过一个函数返回多个值.无奈C,C++不能返回多个值.所以就想有什么方法可以解决. 网上方法比较杂乱,一般有两种替代做法: 1. 利用函数的副作用, 返回值在函数外定义, 在函数 ...

  2. C++引用形参,函数返回多个值

    之前编代码有遇到过想让一个函数返回多个值的情况,low low的我不知道有什么办法,直接使用的全局变量将函数里的值传出去. 今天看书,<C++primer>第五版中文版第189页:使用引用 ...

  3. PHP自定义函数返回多个值

    PHP自定义函数只允许用return语句返回一个值,当return执行以后,整个函数的运行就会终止. 有时要求函数返回多个值时,用return是不可以把值一个接一个地输出的. return语句可以返回 ...

  4. python学习笔记(九)函数返回多个值,列表生成式,循环多个变量,入参格式声明

    一.函数返回多个值 1.函数如果返回多个值的话,它会把这几个值放到一个元组里面2.函数如果返回多个值的话,也可以用多个变量来接收 def say(): num1 = num2 = num3 = ret ...

  5. Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一.什么是指针? 简单来说: 指针就是内存地址      内存地址就是指针. ...

  6. C++ 利用指针和数组以及指针和结构体实现一个函数返回多个值

    C++ 利用指针和数组实现一个函数返回多个值demo1 #include <iostream> using namespace std; int* test(int,int,int); i ...

  7. C# 函数返回多个值的方法

    有时候我们需要一个函数返回多个值,网上更多是用out实现,我个人很喜欢用tuple方法. tuple是一个元组,最多支持7个元素,再多需要嵌套等方法实现. 使用元组定义函数的方法如下: public ...

  8. Go语言示例-函数返回多个值

    Go语言中函数可以返回多个值,这和其它编程语言有很大的不同.对于有其它语言编程经验的人来说,最大的障碍不是学习这个特性,而是很难想到去使用这个特性. 简单如交换两个数值的例子: package mai ...

  9. C++11中的tuple应用:让函数返回多个值

    在没有tuple之前,如果函数需要返回多个值,则必须定义一个结构体,有了C++11,可以基于tuple直接做了,下面是个示例: // 编译:g++ -std=c++11 -g -o x x.cpp # ...

随机推荐

  1. JAVA JSP笔记

    一.jsp加载项目中资源图片 如果直接将静态页面写的代码copy到jsp中,你会发现图片都无法加载. 获取代码: String path = request.getContextPath(); Str ...

  2. python中的TypeError错误解决办法

    新手在学习python时候,会遇到很多的坑,下面来具体说说其中一个. 在使用python编写面向对象的程序时,新手可能遇到TypeError: this constructor takes no ar ...

  3. python之路目录

    python开发[第一篇]:目录 python开发[第二篇]:python初体验 python开发[第三篇]:python基础之条件控制与循环 python开发[第四篇]:python基础之运算符 p ...

  4. Workflow笔记1——工作流介绍

    什么是工作流? 工作流(Workflow),是对工作流程及其各操作步骤之间业务规则的抽象.概括.描述.BPM:是Business Process Management的英文字母缩写.即业务流程管理,是 ...

  5. PDO运用

  6. Mybatis框架的模糊查询(多种写法)、删除、添加(四)

    学习Mybatis这么多天,那么我给大家分享一下我的学习成果.从最基础的开始配置. 一.创建一个web项目,看一下项目架构 二.说道项目就会想到需要什么jar 三.就是准备大配置链接Orcl数据库 & ...

  7. shiro在springmvc里面的集成使用【转】

    <dependency> <groupId>commons-collections</groupId> <artifactId>commons-coll ...

  8. ArcGIS Engine开发之图形查询

    图形查询是以用户通过鼠标操作生成的图形几何体为输入条件进行查询的查询,其查询结果为该几何体空间范围内的所有要素.常用的查询方式包括点选.线选.多边形选择.圆形选择和矩形选择等. 相关类与接口 图像查询 ...

  9. 判断终端的js

    $(function(){ var sUserAgent = navigator.userAgent.toLowerCase(); var bIsIpad = sUserAgent.match(/ip ...

  10. 慎用mutableCopy

    因为逻辑需要,我在present到一个页面时,将一个存放uiimage的数组mutablecopy了过去(因为再返回的时候防止对数组做了改动),时间长了也忘了这事儿,后来发现添加多张图片上传时,app ...