函数返回多个值(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

时间: 2024-10-12 13:05:55

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

PHP自定义函数返回多个值

PHP自定义函数只允许用return语句返回一个值,当return执行以后,整个函数的运行就会终止. 有时要求函数返回多个值时,用return是不可以把值一个接一个地输出的. return语句可以返回任何类型的变量,这就是使自定义函数返回多个值的关键. 代码:  <?php function results($string) {      $result = array();      $result[] = $string;//原字符串     $result[] = strtoupper($

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

目录(?)[+] 一.什么是指针? 简单来说: 指针就是内存地址      内存地址就是指针.来看个小案例 #include<stdio.h> #include<stdlib.h> /** 指针就是内存地址 内存地址就是指针 */ main() { //定义一个int类型的变量i,并且赋值为10 int i=10; //定义一个int类型的一级指针变量p int* p; //把i对应的地址给p变量 p=&i; //指针取值*p:把p变量地址对应的值取出来 printf(&q

这样strstr函数返回了NULL值也就是0,和1比较不相等

但是到这里,我们已经可以确认一件事就是so中的解密函数逻辑有一层防护就是判断当前调用so的应用包名是否为正确的视频包名,如果不是就不走正确的解密逻辑了.所以这里我们需要修改一下so指令,让这个判断无效.修改指令其实很简单,我们看到他通过判断strstr函数返回的NULL值,也就是对应 CMP R0,#0 指令值,然后后面有一个BEQ跳转指令,这里我们可以这么改,他不是和0判断吗?其实0就是NULL值,我们把他改成和1比较,这样strstr函数返回了NULL值也就是0,和1比较不相等.那就正确的逻

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

有时候我们需要一个函数返回多个值,网上更多是用out实现,我个人很喜欢用tuple方法. tuple是一个元组,最多支持7个元素,再多需要嵌套等方法实现. 使用元组定义函数的方法如下: public static Tuple<string,string> TupleFun() { string[] T = {'hello','world'}; Tuple<string, string> tup = new Tuple<string, string>(T[0], T[2]

2017-3-5 函数 函数返回多个值 递归和菲波那契数列练习

(一)函数的定义:非常抽象,独立完成某项功能的独立个体. 作用:1提高代码的重用性 2提高功能开发的效率性 3提高程序代码的可维护性 函数分为   固定功能函数  高度抽象函数 函数的4要素:输入  输出  函数名  函数体 函数的多种形态: 1.   4要素齐全的 public static 返回值类型 函数名(需要的参数,可以多个,多种数据类型) { 函数体 return 返回返回值类型的数据 } 2.  有参数无返回值的 public ststic void 函数名(参数) { 函数体 }

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

Go语言中函数可以返回多个值,这和其它编程语言有很大的不同.对于有其它语言编程经验的人来说,最大的障碍不是学习这个特性,而是很难想到去使用这个特性. 简单如交换两个数值的例子: package main import "fmt" func swap(a int, b int) (int, int) { return b, a } func main() { a := 1 b := 2 a, b = swap(a, b) fmt.Println(a) fmt.Println(b) } 输

swift函数返回多个值

swift的函数可以使用元组的形式返回多个值. class func getMaxMinWeight(arr:[YMDateRecord]) -> (max:Float,min:Float){ var maxV:Float = 0 var minV:Float = 0 for info in arr{ if info.weight >= maxV{ maxV = info.temperature } if info.weight <= minV{ minV = info.temperat

(C/C++函数返回多个值)

当我们在处理一个数组的时候常常会碰到这样的问题:输入一个数组,和数组的一个元素,返回该元素所在行数和列数.这样就需要返回多组两个值,且组数不定.上述类型的函数在c语言程序里面存在两个问题.第一,函数只能返回一个值(指针):第二,若以指针返回值,则不确定指针所指的内存大小.以下先分别解决这两个问题,之后综合考虑. 1返回多个值的函数 1.1采用指针参量记录值 不用函数的返回值,直接用指针来处理.在函数的输入项里加入一个指针,用来保存记录多个值.如下所示,a[N][M]为要处理的数组,s为要找的数,

0924,函数返回多个值

class Program { //函数多个返回值 //输入参数前加Out就变成输出参数 public int jisuan(int a, int b, out int c) { c = a - b; return a + b; } public int jiefangcheng(int a, int b, int c, out double x1, out double x2) { x1 = 0; x2 = 0; if (0 == b * b - 4 * a * c) { x1 = (-b)