當我們在處理一個數組的時候常常會碰到這樣的問題:輸入一個數組,和數組的一個元素,返回該元素所在行數和列數。這樣就需要返回多組兩個值,且組數不定。上述類型的函數在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 }
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