Chinaunix首页 | 论坛 | 博客
  • 博客访问: 38823
  • 博文数量: 8
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 45
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-14 17:28
个人简介

技术or管理

文章分类

全部博文(8)

文章存档

2016年(1)

2013年(4)

2012年(1)

2010年(2)

我的朋友

分类: C/C++

2010-03-14 20:20:30

定义:
将一个函数指针作为参数传递给其他函数,后者将“回调”函数指针指向的函数。
int (*func_p)(void *arg1, void *arg2);//定义一个函数指针;

例如:
在单链表中查找一个值
Node *search_list(Node *node, int const value)
{
    while(node != NULL)
    {
        if (node->value == value)
        {
            break;
        }
        else
        {
            node = node->next;
        }
    }

    return node;
}
这个函数的缺点是只能用在查找值为整数的链表中,如果你要在一个字符串链表中查找,就不能用这个函数了,只能重新写一个。怎么才能使查找函数与类型无关呢?使用函数指针。
Node *search_list(node *node, void *value, int (*compare)(void *, void *))
{
    while (node != NULL)
    {
        if (0 == compare(&(node->value), value))
        {
           break;
        }
        else
        {
            node = node->next
        }
    }

    return node;
}

如果是一个整形的链表,你可以这样写比较函数
int compare_int(void *a, void *b)
{
    if (*(int *)a == *(int *)b)\
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

这样使用它:
result_node = search_list(node, *value, compare_int);

说明:关于函数和函数指针
int func(int);
int (*func_p)(int) = &func; int (*func_p)(int) = func;//效果是一样的,因为函数在被使用的时候总是由编译器把它转换为函数指针。

可以有三种方式使用:
int ret;
ret = func();
ret = func_p();
ret = (*func_p)();

详细内容请参考《c和指针》一书


阅读(1590) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~