免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: nanjingnew4
打印 上一主题 下一主题

几个函数指针问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2011-11-21 20:13 |只看该作者
本帖最后由 digdeep126 于 2011-11-21 20:16 编辑

不用!你完全不懂函数指针的用法。my_compare是作为一个参数参给my_sort,然后my_sort在它的内部来使用它来比较大小(调用它)。
  1. void my_sort(void *data, int length, int size, compare my_compare){
  2.         char *d1,*d2;
  3.         //do something
  4.         if(my_compare(d1,d2)<0){
  5.           //do something
  6.         }else if(my_compare(d1,d2)==0){
  7.           //do something
  8.         }
  9.         else{
  10.           //do something
  11.         }
  12.         //do something
  13. }
复制代码
注意:if(my_compare(d1,d2)<0){

论坛徽章:
0
22 [报告]
发表于 2011-11-22 09:45 |只看该作者
回复 21# digdeep126

  1. typedef int (*compare)(const void *x, const void *y);

  2. int my_compare(const void *x, const void *y){
  3.         const int *a=(int *)x;
  4.         const int *b=(int *)y;
  5.         if(*a>*b)
  6.           return 1;
  7.         if(*a==*b)
  8.           return 0;
  9.         return -1;
  10. }

  11. // -- compare conmpareFunc是不是要求compareFunc的函数原型返回值必须是compare类型??
  12. //也就是说my_compare这个函数返回值应该是个指针,指向另一个函数,该函数的参数是(const void *, const void *)
  13. void my_sort(void *data, int length, int size, compare compareFunc){
  14.         char *d1,*d2;
  15.         //do something
  16.         if(compareFunc(d1,d2)<0){
  17.           //do something
  18.         }else if(compareFunc(d1,d2)==0){
  19.           //do something
  20.         }
  21.         else{
  22.           //do something
  23.         }
  24.         //do something
  25. }

  26. int main(int argc, char **argv){
  27.         int arr={2,4,3,656,23};
  28. // 传递my_compare的地址
  29.         my_sort(arr, 5, sizeof(int), my_compare);
  30.         //do something
  31.         return 0;
  32. }
复制代码
恩,大致懂了,注释中提到的一个想法对不对?

论坛徽章:
0
23 [报告]
发表于 2011-11-22 13:09 |只看该作者
    // -- compare conmpareFunc是不是要求compareFunc的函数原型返回值必须是compare类型??
//也就是说my_compare这个函数返回值应该是个指针,指向另一个函数,该函数的参数是(const void *, const void *)
nanjingnew4 发表于 2011-11-22 09:45


不好意思,你又理解错了!
-- compare conmpareFunc是要求compareFunc的函数原型必须是compare类型!!
也就是说my_compare这个函数返回值应该是一个int,它的参数是(const void *, const void *)

论坛徽章:
0
24 [报告]
发表于 2011-11-22 14:03 |只看该作者
回复 23# digdeep126


    没看懂,你的意思是
int  my_compare(const void *,const void *){
             int a=1;
             return a;
}
还是

int  my_compare(const void *,const void *){
             int compare_return(const void *,const void *);
             return compare_return;
}

我的理解是第二种,因为 typedef int (*compare)(const void *x, const void *y);
如果去掉typedef,表明compare是个函数,返回一个指针,该指针指向一个返回类型为int的函数,原型为(const void *x, const void *y);

论坛徽章:
0
25 [报告]
发表于 2011-11-22 14:04 |只看该作者
回复 24# nanjingnew4


    第一种。

论坛徽章:
0
26 [报告]
发表于 2011-11-22 14:06 |只看该作者
typedef int (*compare)(const void *x, const void *y);
如果去掉typedef,表明compare是个函数,返回一个指针,该指针指向一个返回类型为int的函数,原型为(const void *x, const void *y);
nanjingnew4 发表于 2011-11-22 14:03


去掉typedef,表明compare是个函数指针,它指向的函数的返回值为int,它指向的函数的参数是(const void *x, const void *y)。

论坛徽章:
0
27 [报告]
发表于 2011-11-22 14:36 |只看该作者
本帖最后由 nanjingnew4 于 2011-11-22 15:09 编辑

回复 26# digdeep126
  1. #include<stdio.h>
  2. #include <assert.h>
  3. double GetMin(double *dbData, int iSize)               // 求最小值
  4. {
  5.         double dbMin;
  6.         int i;
  7.         assert(iSize>0);
  8.         dbMin=dbData[0];
  9.         for (i=1; i<iSize; i++){
  10.         if (dbMin>dbData[i]) {
  11.                 dbMin=dbData[i];
  12.                 }
  13.         }
  14.         return dbMin;

  15. }

  16. typedef double (*PF)(double *dbData, int iSize);     // 定义函数指针类型

  17. PF GetOperation(char c)                              // 根据字符得到操作类型,返回函数指针

  18. {
  19.         switch (c)
  20.         {

  21.          case 'd':

  22.               return GetMin;
  23.         }

  24. }
  25. int main(void)
  26. {
  27.         double dbData[]={3.1415926, 1.4142, -0.5,999, -313, 365};
  28.         int iSize=sizeof(dbData)/sizeof(dbData[0]);
  29.         char c;
  30.         printf("Please input the Operation :\n");
  31.         c=getchar();
  32.         printf("result is %lf\n", GetOperation(c)(dbData,iSize));   // 通过函数指针调用函数
  33. }
复制代码
因为我看了别人写函数指针的一段代码,所以再看你说的,有点犯晕
而且void my_sort(void *data, int length, int size, compare compareFunc)是不是可以写成这样
void my_sort(void *data, int length, int size, int (*compareFunc(const void *,const void *))(const void *,const void *))

论坛徽章:
0
28 [报告]
发表于 2011-11-22 17:51 |只看该作者
而且void my_sort(void *data, int length, int size, compare compareFunc)是不是可以写成这样
void my_sort(void *data, int length, int size, int (*compareFunc(const void *,const void *))(const void *,const void *))
nanjingnew4 发表于 2011-11-22 14:36

应该是这样写:void my_sort(void *data, int length, int size, int (*compareFunc)(const void *,const void *))

论坛徽章:
0
29 [报告]
发表于 2011-11-24 08:56 |只看该作者
函数指针的目的是实现多态,
其实C++的虚函数表就是函数指针集,恰当的时候把函数指针替换为想要的函数

在小程序中直接当然没问题,但大系统为了实现多态就得用函数指针了

论坛徽章:
0
30 [报告]
发表于 2011-11-24 08:58 |只看该作者
这种设计的目的是,在sort的对象不一样的时候,调用的比较函数也不一样,但sort的顺序是一样的
这就是多态,
有点像C++中的模板
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP