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"。我不明白为什么。我知道这是一种我不做的演员阵容,因为我觉得我在减去地址。我会用
对于
任何帮助都将不胜感激。谢谢您!
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就很方便。在您的实例中,函数指针是完全不必要的。
对于强制转换,允许将任何指针类型隐式转换为
1 2 3 4 | int compareints(void *a, void *b) { return a-b; } |
这将返回两个
为了让他们的价值观有所不同,你可以这样做-
1 2 3 4 | int compareints(void *a, void *b) { return *(int *)a-*(int *)b; } |
。