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