函數返回多個值(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM