理解void指针和typedef指针函数

时间:2015-09-25 03:43:58

标签: c pointers typedef void-pointers

我正在尝试了解具有typedef(在C中)的void指针和函数。我似乎无法理解这个概念。

我有这个简单的代码:

#include <stdio.h>

typedef int (*CompareFunc)(void*, void*);

int compareints(void *a, void *b)
{
    return a-b;
}

int comparedbls(void *a, void *b)
{
    return a-b;
}

int main()
{
    int a = 1, b = 1;

    int* ptrA = &a;
    int* ptrB = &b;

    CompareFunc test = compareints;
    printf("%d\n", test(ptrA, ptrB));


    return 0;
}

此处的输出为“-4”。我不明白为什么。我知道这是某种我没有做的演员,因为我觉得我在减去地址。我会使用void *a打印void *bprintf("%d", a)的值以查看它们具有的值,但它表示它不能,因为a是一个无效指针。

使用CompareFunc函数,我是否必须创建一个新变量来指向我想要的每个函数?我不太确定在什么情况下在指针函数上使用typedef会有用。为什么不直接拨打compareints()?问,因为我有一个任务,无法弄清楚为什么我们需要像这样编码。

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:2)

compareints()返回两个指针之间的差异,无论这是否是您的意图。如果没有,您可能想尝试这个:

int compareints(void *a, void *b)
{
    return *(int *)a - *(int *)b;
}

和此:

double comparedbls(void *a, void *b)
{
    return *(double *)a - *(double *)b;
}

您调用它的方式产生的值是实现定义的,因为局部变量可以按任何顺序排列在堆栈上。

  

使用CompareFunc函数,我是否必须创建一个新变量来指向我想要的每个函数?

没有。函数指针可以指向与指针具有相同签名的任何函数。

函数指针的Typedef可以很方便,例如,如果需要将比较函数传递给泛型排序算法。在您的实例中,函数指针是完全没必要的。

对于强制转换,允许任何指针类型隐式转换为void *,反之亦然。当您致电compareints()时,即可完成此操作。当减去相同类型的两个指针时,返回类型ptrdiff_t的值,然后从int返回时隐式转换为compareints()

答案 1 :(得分:1)

int compareints(void *a, void *b)
{
    return a-b;
}

这会返回两个pointers a and b之间的差异。但是,您获得的值是实现定义。

为了区分他们的价值,你可以这样做 -

int compareints(void *a, void *b)
{
    return *(int *)a-*(int *)b;
}