函数返回多个值(c/c++)
当我们在处理一个数组的时候常常会碰到这样的问题:输入一个数组,和数组的一个元素,返回该元素所在行数和列数。这样就需要返回多组两个值,且组数不定。上述类型的函数在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++)的更多相关文章
- c,c++函数返回多个值的方法
最近遇到一个问题,需要通过一个函数返回多个值.无奈C,C++不能返回多个值.所以就想有什么方法可以解决. 网上方法比较杂乱,一般有两种替代做法: 1. 利用函数的副作用, 返回值在函数外定义, 在函数 ...
- C++引用形参,函数返回多个值
之前编代码有遇到过想让一个函数返回多个值的情况,low low的我不知道有什么办法,直接使用的全局变量将函数里的值传出去. 今天看书,<C++primer>第五版中文版第189页:使用引用 ...
- PHP自定义函数返回多个值
PHP自定义函数只允许用return语句返回一个值,当return执行以后,整个函数的运行就会终止. 有时要求函数返回多个值时,用return是不可以把值一个接一个地输出的. return语句可以返回 ...
- python学习笔记(九)函数返回多个值,列表生成式,循环多个变量,入参格式声明
一.函数返回多个值 1.函数如果返回多个值的话,它会把这几个值放到一个元组里面2.函数如果返回多个值的话,也可以用多个变量来接收 def say(): num1 = num2 = num3 = ret ...
- Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一.什么是指针? 简单来说: 指针就是内存地址 内存地址就是指针. ...
- C++ 利用指针和数组以及指针和结构体实现一个函数返回多个值
C++ 利用指针和数组实现一个函数返回多个值demo1 #include <iostream> using namespace std; int* test(int,int,int); i ...
- C# 函数返回多个值的方法
有时候我们需要一个函数返回多个值,网上更多是用out实现,我个人很喜欢用tuple方法. tuple是一个元组,最多支持7个元素,再多需要嵌套等方法实现. 使用元组定义函数的方法如下: public ...
- Go语言示例-函数返回多个值
Go语言中函数可以返回多个值,这和其它编程语言有很大的不同.对于有其它语言编程经验的人来说,最大的障碍不是学习这个特性,而是很难想到去使用这个特性. 简单如交换两个数值的例子: package mai ...
- C++11中的tuple应用:让函数返回多个值
在没有tuple之前,如果函数需要返回多个值,则必须定义一个结构体,有了C++11,可以基于tuple直接做了,下面是个示例: // 编译:g++ -std=c++11 -g -o x x.cpp # ...
随机推荐
- Linux安装MySQL
步骤: 1 [qq@localhost Desktop]$ su root //以root身份进入 Password:(默认为空) 2 [root@localhost Desktop]# yum ...
- js Form.elements[i]的使用实例
function pdf(){ //一个html里面可能存在多个form,所以document.form[0]指的是第一个form,document.form[1]返回就是第二个form,如果没 ...
- Hibernate4.2.4入门(一)——环境搭建和简单例子
一.前言 发下牢骚,这段时间要做项目,又要学框架,搞得都没时间写笔记,但是觉得这知识学过还是要记录下.进入主题了 1.1.Hibernate简介 什么是Hibernate?Hibernate有什么用? ...
- CartO
Carto documentation The following is a list of properties provided in CartoCSS that you can apply to ...
- Scala 包
包的绝对地址_root_.开始 如_root_.scala.collection.mutable.ArrayBuffer
- no identity found Command /usr/bin/codesign failed with exit code 1 报错解决方法
stackoverflow 的解决方法是 xcode->preference->account->view detail -> refresh the provisioning ...
- pdf文件的导入导出
下面的代码自己本人没有尝试过,只是用来做记录,用到时候再说! 最近碰见个需求需要实现导出pdf文件,上网查了下代码资料总结了以下代码.可以成功的实现导出pdf文件. 在编码前需要在网上下载个itext ...
- 鹏程网用户管理系统学习(2016-07-18 by 徐鹏)
新的平台:X平台(x.hna.net)旧的平台:鹏程网(www.hna.net) 如今的平台情况:很多业务已经转到X平台,但也存在少量的业务还是用鹏程网的旧系统.例如**用户管理系统(也逐渐转移到易服 ...
- Oracle 数据库中对记录进行分页处理——学习笔记
学习到 oracle 的视图的时候,了解到对 Oracle 中数据的记录进行分页处理和 Mysql 提供的 limit 来进行分页处理大有不同,limit 是 mysql 中特有的关键字. 那么在 o ...
- 萌新笔记——linux下(ubuntu)反删除(误删恢复)与回收站制作
刚刚有个小伙伴不小心删了他写了好几的天代码,为他心疼之余帮他找回了文件. 想到我之前也常常误删一些文件,就干脆分享一下我的反删除方法,并说说我做的回收站(好low的,求大神指点) 首先是反删除软件ex ...