当我们在处理一个数组的时候常常会碰到这样的问题:输入一个数组,和数组的一个元素,返回该元素所在行数和列数。这样就需要返回多组两个值,且组数不定。上述类型的函数在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. fluent批量处理——模型参数的设置

    对于常见的工程应用来说,计算的工况很多,尤其优化工作,少则几百,多则上千,面对如此之多的case文件要写,假如按照一个一个的读写的话,相信你一定会为这么机械的工作烦躁,甚至影响今后好几天的心情,那么有 ...

  2. python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)

    一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...

  3. 从网上找的 visual studio 的各个版本下载地址,vs2010/vs2012/vs2013带注册码

    从网上找的 visual studio 的各个版本下载地址,很全,从 6.0 一直 到 vs2013,要的拿去吧... Microsoft Visual Studio 6.0 下载:英文版360云盘下 ...

  4. ASP.Net MVC数据传递

    今天做了个项目,涉及到离线下载HTML,没有前后台交互,没有Ajax,JavaScript,只有第一次从控制器带参数进入,一次读取到页面所需要的全部数据,使用Razor语法绑定到前台页面,在做这个项目 ...

  5. Images.xcassets不能获取图片路径

    原文地址:http://www.jianshu.com/p/5358f587af38 Images.xcassets在app打包后,以Assets.car文件的形式出现在bundle中.其作用在于: ...

  6. Android中使用Notification实现宽视图通知栏(Notification示例二)

    Notification是在你的应用常规界面之外展示的消息.当app让系统发送一个消息的时候,消息首先以图表的形式显示在通知栏.要查看消息的详情需要进入通知抽屉(notificationdrawer) ...

  7. 基于Python+Django的Kubernetes集群管理平台

    ➠更多技术干货请戳:听云博客 时至今日,接触kubernetes也有一段时间了,而我们的大部分业务也已经稳定地运行在不同规模的kubernetes集群上,不得不说,无论是从应用部署.迭代,还是从资源调 ...

  8. java socket传送一个结构体给用C++编写的服务器解析的问题

    另一端是Java写客户端程序,两者之间需要通信.c++/c接收和发送的都是结构体,而Java是直接发送的字节流或者byte 数组.解决方法:c++/c socket 在发送结构体的时候其实发送的也是字 ...

  9. js实现发送验证码倒计时按钮

    在写注册页面时,有时候需要发送注册邮件来获取验证码,但是为了防止多次重复发送邮件, 必须让按钮隔一段时间后才能再次使用. 代码如下: <html> <head> <met ...

  10. 在Asp.net MVC 3 web应用程序中,我们会用到ViewData与ViewBag,对比一下:

    Asp.net MVC中的ViewData与ViewBag ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从Asp.net MVC 1 就有了 ASP. ...