当我们在处理一个数组的时候常常会碰到这样的问题:输入一个数组,和数组的一个元素,返回该元素所在行数和列数。这样就需要返回多组两个值,且组数不定。上述类型的函数在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://www.cnblogs.com/infinitelearning/p/10034418.html

转载:(C/C++函数返回多个值)相关推荐

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

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

  2. python学习笔记-day6-函数的延续【汉字转拼音模块,函数返回多个值,匿名函数,列表生成式,generator生成器,三元运算符】...

    继续来说函数的后续知识点,主要是函数返回多个值,匿名函数,三元运算符,算是比较小的知识点. 一.汉字转拼音模的使用 1.安装模块 #install xpinyin 2.如果使用 结果: 二.函数返回多 ...

  3. c++中函数放在等号右边_如何从C或C++中的函数返回多个值?

    新程序员通常在寻找从函数返回多个值的方法.不幸的是,C和C++不允许直接这样做.但是幸运的是,通过一些巧妙的编程,我们可以轻松实现这一目标. 下面是从C函数中返回多个值的方法: 通过使用指针. 通过使 ...

  4. Python学习之函数返回多个值

    Python学习之函数返回多个值 问题的引出 Python中,一个函数能不能一次返回多个值? 在C语言中,函数最多返回一个值,如果要返回多个值,可以把这些值封装在一个结构体中.注意,C语言不允许函数返 ...

  5. python函数返回多个值_python函数返回多个值的示例方法

    python可以返回多个值,确实挺方便 函数里的return只能返回一个值,但是返回类型是没是限制的 因此,我们可以"返回一个 tuple类型,来间接达到返回多个值". 例子是我在 ...

  6. Java中如何实现一个函数返回多个值

    由于java中没有指针,不能像C++一样通过指针的方式实现一个函数返回多个值,因此在java中必须采用变通的方式解决,常用的方式有以下几种: 1.封装一个实体类,将要返回的值封装进去: 2.通过map ...

  7. C语言通过指针间接的实现函数返回多个值

    C语言通过指针间接的实现函数返回多个值 本例题中通过把指针作为函数参数来传递,依次达到改变变量的值的目的,最后实现一个函数返回两个变量的值 int *X,*X应该被看成一个整体来看,表示一个整形. # ...

  8. 指针实现函数返回多个值

    通常情况下,函数如果有返回值,那么该函数的返回值类型必须和函数的类型一致,并且一个函数只能有一个返回值.下面我们通过指针来间接实现函数返回多个值 void caculator(int a,int b, ...

  9. matlab函数结果,matlab 函数返回多个值--样例

    matlab 函数返回多个值--样例 发布时间:2018-02-14 19:52, 浏览次数:2062 , 标签: matlab 目录 一.matlab的函数文件返回多个值写法 二.简单的例子 三.  ...

最新文章

  1. syslog打印不带等级_socket发送syslog不能获得级别
  2. 《算法导论》中parallel for 的时间复杂度
  3. python【蓝桥杯vip练习题库】ADV-281特等奖学金
  4. 【设备】WIN10怎么用佳能LIDE120扫描仪?
  5. 机器学习:线性回归I 最小二乘法
  6. GitHub 发布重磅更新:你电脑上的 IDE 可以删了?!
  7. 高级数据结构---并查集
  8. HDU 4701 Game
  9. 邮件误删不用怕,试试这个方法帮你找回来
  10. DevExpress WPF v19.1新版亮点:PDF Viewer等控件新功能
  11. Android JNI的调用过程
  12. MySQL-Front设置中文
  13. Darklabel多目标跟踪标注工具
  14. sqlmap注入之tamper绕过WAF防火墙过滤
  15. 世界上最早的手动计算机,世界上第一台电子计算机诞生于多少年,名字叫做什么...
  16. 非形式逻辑(04)因果关系和推理
  17. 快速入门Sqlite数据库应用
  18. 中电资讯-银保监会提示防范“元宇宙”风险
  19. VueJs中的reactive函数
  20. Linux—教你两个方法轻松找回root密码

热门文章

  1. “sql2005管道的另一端上无任何进程”及附带一系列问题完整解决方法
  2. 【CyberSecurityLearning 24】kali中间人攻击
  3. 在代码段中安排自己定义的数据
  4. 合并排序的非递归实现(自底向上设计)
  5. 白话详细解读(七)----- CBAM:Convolutional Block Attention Module
  6. Altium Designer -- PCB 叠层设计
  7. 计算机电子与网络技术,电子信息工程与计算机网络技术
  8. 高cpu_再一次生产 CPU 高负载排查实践
  9. 用隐马尔可夫模型(HMM)做命名实体识别——NER系列(二)
  10. [原创]基于frida的脱壳工具