免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 6592 | 回复: 29
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-19 12:12 |只看该作者 |倒序浏览
typedef int (*compare)(const void *x, const void *y);

int my_compare(const void *x, const void *y){
        const int *a=(int *)x;
        const int *b=(int *)y;
        if(*a>*b)
          return 1;
        if(*a==*b)
          return 0;
        return -1;
}

void my_sort(void *data, int length, int size, compare){
        char *d1,*d2;
        //do something
        if(compare(d1,d2)<0){
          //do something
        }else if(compare(d1,d2)==0){
          //do something
        }
        else{
          //do something
        }
        //do something
}

int main(int argc, char **argv){
        int arr={2,4,3,656,23};
        my_sort(arr, 5, sizeof(int), my_compare);
        //do something
        return 0;
}



以上是代码部分,个人理解compare是函数指针,main调用sort函数,其中有个参数是compare,但是我看来看去觉得这个typedef这一行是多余的,不知道我理解哪里出问题。。各位大大帮忙看下

论坛徽章:
0
2 [报告]
发表于 2011-11-19 12:16 |只看该作者
没有typedef的类型别名,你如何能够使用compare这个类型标识呢?
compare不是指针,是一个函数指针类型别名标识。你没有理解typedef的含义。

论坛徽章:
0
3 [报告]
发表于 2011-11-19 12:24 |只看该作者
回复 1# nanjingnew4

void my_sort(void *data, int length, int size, compare){

这里写的有问题
只有类型的名字
没有形参

论坛徽章:
0
4 [报告]
发表于 2011-11-19 12:26 |只看该作者
没有typedef的类型别名,你如何能够使用compare这个类型标识呢?
compare不是指针,是一个函数指针类型别名 ...
samzc2010 发表于 2011-11-19 12:16



    但是我觉得compare和my_compare一样的呀。那我把sort函数参数换成my_compare呢

论坛徽章:
0
5 [报告]
发表于 2011-11-19 12:29 |只看该作者
但是我觉得compare和my_compare一样的呀。那我把sort函数参数换成my_compare呢
nanjingnew4 发表于 2011-11-19 12:26



    my_compare是一个函数的名字,compare经过typedef之后就是类似int一样的一个新的类型标识。你明白么?去看看typedef到底是干什么用的,你对typedef不理解。

论坛徽章:
0
6 [报告]
发表于 2011-11-19 12:37 |只看该作者
my_compare是一个函数的名字,compare经过typedef之后就是类似int一样的一个新的类型标识。你明白 ...
samzc2010 发表于 2011-11-19 12:29



   1: typedef我知道,但这个compare写在这里是不是多余?我觉得用my_compare直接调用不就行了
  2:但是main函数里用sort传参用的my_compare,而sort原型第三个参数类型是compare,类型是不是也不对?这样传参用的是my_compare函数还是compare这个类型的函数?

论坛徽章:
0
7 [报告]
发表于 2011-11-19 15:50 |只看该作者

  1. // -- 这里定义了一个新的数据类型 -- 函数指针类型,这个类型的函数具有两个const void*类型的参数。
  2. // -- 我再强调一遍,这里定义的十一个数据类型,你可以把它看作和int/double/char等等类似的数据类型。
  3. typedef int (*compare)(const void *x, const void *y);

  4. // -- 这里是一个函数的定义,他的名字my_compare,注意这里是名字不是类型!
  5. int my_compare(const void *x, const void *y){
  6.         const int *a=(int *)x;
  7.         const int *b=(int *)y;
  8.         if(*a>*b)
  9.           return 1;
  10.         if(*a==*b)
  11.           return 0;
  12.         return -1;
  13. }

  14. // -- my_sort这个函数你的定义是错误的,你明白么?正确的写法如下
  15. // void my_sort(void *data, int length, int size, compare compareFunc)
  16. // 另外,把你这个函数内对compare的调用一律替换为comapreFunc
  17. // -- 你没有理解typedef的含义,也就无法理解这个函数的错误所在
  18. void my_sort(void *data, int length, int size, compare){
  19.         char *d1,*d2;
  20.         //do something
  21.         if(compare(d1,d2)<0){
  22.           //do something
  23.         }else if(compare(d1,d2)==0){
  24.           //do something
  25.         }
  26.         else{
  27.           //do something
  28.         }
  29.         //do something
  30. }

  31. int main(int argc, char **argv){
  32.         int arr={2,4,3,656,23};
  33. // 你这里对函数的使用,传递进去的恰恰就是my_compare这个函数的地址,也就是说传递了一个compare类型的函数地址给my_sort函数
  34.         my_sort(arr, 5, sizeof(int), my_compare);
  35.         //do something
  36.         return 0;
  37. }
复制代码
不知到我上面的解释你明白了么?让你看typedef,你最好弄明白这个操作符的意思再继续。

1: typedef我知道,但这个compare写在这里是不是多余?我觉得用my_compare直接调用不就行了
  2 ...
nanjingnew4 发表于 2011-11-19 12:37

论坛徽章:
0
8 [报告]
发表于 2011-11-19 17:01 |只看该作者
本帖最后由 keytounix 于 2011-11-20 13:00 编辑

说说我的理解吧,未必对,欢迎大家指正
typedef int (*Compare_t)(const void *x, const void *y);

///////////////////////////////

int my_compare(const void *, const void *)
{

//////////////////
}


Compare_t my_comp_func=  my_compare;


void my_sort(void *data, int length, int size, Compare_t cmp_func)
{

//

}
这个时候


int main(int argc, char **argv)
{
////
        my_sort(arr, 5, sizeof(int), my_comp_func);
//////
}


就是这样的

2. cmp函数的优化

int my_compare(const void *x, const void *y)
{
return *x - *y;  

}



3. eg

为了便于理解
可以弄一个 简单的
#include <stdio.h>
#include <stdlib.h>
typedef   int (*Func_t)(int,int);
int sum(int a,int b)
{
return a+b;
}


int main(int n,char *v[])
{
Func_t  my_sum= &sum;
int a=1;
int b=100;
printf("%d+%d=%d",a,b,my_sum(a+b));
return 0;

}

论坛徽章:
0
9 [报告]
发表于 2011-11-19 18:36 |只看该作者
int my_compare(const void *x, const void *y)
{
return *x - *y;  
}
//// ...
keytounix 发表于 2011-11-19 17:01

你这样有溢出风险吧。而且你也在用:void - void 。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
10 [报告]
发表于 2011-11-19 18:47 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP