c语言函数指针做函数参数问题
voidbubble_sort(int*a,intn,int(*cmp)(int,int)){inti,j;for(j=0;j<n1;j++)for(...
void b u b b l e _ s o r t ( i n t * a , i n t n,i n t (*cmp ) ( int , i n t ) ) {
i n t i , j ;
f o r ( j =0; j <n1; j ++)
f o r ( i =0; i <nj 1; i ++)
i f ( ( * cmp ) ( a [ i ] , a [ j ] ) ) swap ( a+i , a+i +1);
}i
n t b i g g e r ( i n t a , i n t b ){ return a>b ; }
i n t s m a l l e r ( i n t a , i n t b ){ return a<b ; }
void main ( ) {
i n t a [ ] = { 1 , 3 4 , 2 , 8 , 7 , 11 , 23 , 54 , 1 2 } ;
b u b b l e _ s o r t ( a , s i z e o f ( a )/ s i z e o f ( a [ 0 ] ) , s m a l l e r ) ;
b u b b l e _ s o r t ( a , s i z e o f ( a )/ s i z e o f ( a [ 0 ] ) , b i g g e r ) ;
}
最后两个语句的s m a l l e r, b i g g e r的值为什么能给i n t (*cmp ) ( int , i n t ) )呢?这个不是指针吗?
我知道原理,但是过程这里有问题:如果smaller=1的话,代入i n t (*cmp ) ( int , i n t ) ),什么意思?一个是int的数,另一个是指针,怎么能代?(四方格是减号,没编辑好) 展开
i n t i , j ;
f o r ( j =0; j <n1; j ++)
f o r ( i =0; i <nj 1; i ++)
i f ( ( * cmp ) ( a [ i ] , a [ j ] ) ) swap ( a+i , a+i +1);
}i
n t b i g g e r ( i n t a , i n t b ){ return a>b ; }
i n t s m a l l e r ( i n t a , i n t b ){ return a<b ; }
void main ( ) {
i n t a [ ] = { 1 , 3 4 , 2 , 8 , 7 , 11 , 23 , 54 , 1 2 } ;
b u b b l e _ s o r t ( a , s i z e o f ( a )/ s i z e o f ( a [ 0 ] ) , s m a l l e r ) ;
b u b b l e _ s o r t ( a , s i z e o f ( a )/ s i z e o f ( a [ 0 ] ) , b i g g e r ) ;
}
最后两个语句的s m a l l e r, b i g g e r的值为什么能给i n t (*cmp ) ( int , i n t ) )呢?这个不是指针吗?
我知道原理,但是过程这里有问题:如果smaller=1的话,代入i n t (*cmp ) ( int , i n t ) ),什么意思?一个是int的数,另一个是指针,怎么能代?(四方格是减号,没编辑好) 展开
4个回答
展开全部
两个比较函数的名做指针分别做参数代入排序,
这样,一个排序由小到大,后一个由大到小,如此而已。
很简单的。
是不是编译有问题?
这样,一个排序由小到大,后一个由大到小,如此而已。
很简单的。
是不是编译有问题?
追问
我知道原理,但是过程这里有问题:如果smaller=1的话,代入i n t (*cmp ) ( int , i n t ) ),什么意思?一个是int的数,另一个是指针,怎么能代?
追答
你可能是不理解函数名做参数的合理性,
排序函数的参数cmp的类型是 int (*)(int,int )
i n t (*cmp ) ( int , i n t ) )
cmp就是函数指针,
而smaller,b i g g e r这两个函数也是
这个类型 int (*)(int,int),
就可以实参的形式代入,排 序函数中执行 (*cmp)(inta,intb)时,
实际就是执行了smaller或bigger,很简单,再仔想想就明白了。
排序函数中的 (*cmp)(inta,intb)还可以直接简写为
cmp(inta,intb),你改一下试试,保证还是正确的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不懂你的补充,smaller是函数啊,它的名字(也就是smaller)就是指向函数smaller的指针,然后作为函数指针传入bubble_sort的参数不是挺对的吗?为什么问smaller=1?它又不是int的数?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
i f ( ( * cmp ) ( a [ i ] , a [ j ] ) ) swap ( a+i , a+i +1);
应该改为
if((*cmp)(a[i],a[i+1]))swap(a+i,a+i+1);
才对。
估记swap是交换两个地址的内容。
b u b b l e _ s o r t函数的最后一个参数是指向函数的指针,即是函数的入口地址。
如果smaller=1的话,代入i n t (*cmp ) ( int , i n t ) ),本身就不对。smaller是函数smaller(int a,int b)的入口地址,即汇编语言中CALL后后面的地址。是告诉排序函数用smaller函数来比较大小。
smaller带入b u b b l e _ s o r t,使if((*cmp)(a[i],a[i+1]))swap(a+i,a+i+1);相当于if(smaller(a[i],a[i+1]))swap(a+i,a+i+1);带入bigger就变为if(bigger(a[i],a[i+1]))swap(a+i,a+i+1);
应该改为
if((*cmp)(a[i],a[i+1]))swap(a+i,a+i+1);
才对。
估记swap是交换两个地址的内容。
b u b b l e _ s o r t函数的最后一个参数是指向函数的指针,即是函数的入口地址。
如果smaller=1的话,代入i n t (*cmp ) ( int , i n t ) ),本身就不对。smaller是函数smaller(int a,int b)的入口地址,即汇编语言中CALL后后面的地址。是告诉排序函数用smaller函数来比较大小。
smaller带入b u b b l e _ s o r t,使if((*cmp)(a[i],a[i+1]))swap(a+i,a+i+1);相当于if(smaller(a[i],a[i+1]))swap(a+i,a+i+1);带入bigger就变为if(bigger(a[i],a[i+1]))swap(a+i,a+i+1);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-05-30
展开全部
......
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询