gpt4 book ai didi

c - 了解 void 指针和 typedef 指针函数

转载 作者:行者123 更新时间:2023-11-30 18:38:45 24 4
gpt4 key购买 nike

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

我有这个简单的代码:

#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”。我不明白为什么。我知道这是我没有做的某种转换,因为我觉得我正在减去地址。我将使用 printf("%d", a) 打印 void *avoid *b 的值,看看它们有什么值,但它说不能,因为 a 是一个 void 指针。

使用CompareFunc函数,我是否必须创建一个新变量来指向我想要的每个函数?我不太确定在什么情况下在指针函数上使用 typedef 会有用。为什么不直接调用 compareints() 呢?之所以问这个问题,是因为我有一项作业,但不明白为什么我们需要这样编写代码。

如有任何帮助,我们将不胜感激。谢谢!

最佳答案

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

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

还有这个:

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?

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

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

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

<小时/>

关于c - 了解 void 指针和 typedef 指针函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32774432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com