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