关于C#:了解void指针和typedef指针函数

Understanding void pointers and typedef pointer functions

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

我有一个简单的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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
"
, test(ptrA, ptrB));


    return 0;
}

这里的输出是"-4"。我不明白为什么。我知道这是一种我不做的演员阵容,因为我觉得我在减去地址。我会用printf("%d", a)打印void *avoid *b的值,看看它们有什么值,但它说不能,因为a是一个空指针。

对于CompareFunc函数,我是否需要创建一个新的变量来指向我想要的每个函数?我不太确定在什么情况下,在指针函数上使用typedef会有用。为什么不直接打电话给compareints()?问是因为我有一个作业,无法理解为什么我们需要这样编码。

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


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

1
2
3
4
int compareints(void *a, void *b)
{
    return *(int *)a - *(int *)b;
}

还有这个:

1
2
3
4
double comparedbls(void *a, void *b)
{
    return *(double *)a - *(double *)b;
}

但是,由于局部变量可以按任意顺序排列在堆栈上,因此由您如何调用它而得到的值是实现定义的。

with the CompareFunc function, would I have to make a new variable to point to every function I want?

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

例如,如果需要将比较函数传递给通用排序算法,函数指针的typedef就很方便。在您的实例中,函数指针是完全不必要的。

对于强制转换,允许将任何指针类型隐式转换为void *,反之亦然。当你打电话给compareints()时,就可以做到这一点。当减去同一类型的两个指针时,返回ptrdiff_t类型的值,然后从compareints()返回时,该值隐式转换为int


1
2
3
4
int compareints(void *a, void *b)
{
    return a-b;
}

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

为了让他们的价值观有所不同,你可以这样做-

1
2
3
4
int compareints(void *a, void *b)
{
    return *(int *)a-*(int *)b;
}