了解 void 指针和 typedef 指针函数
Understanding void pointers and typedef pointer functions
我正在尝试了解 void 指针和具有 typedef 的函数(在 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 *a
和 void *b
的值,看看它们有什么值,但它说不能,因为 a
是一个空指针。
并且使用 CompareFunc
函数,我是否必须创建一个新变量来指向我想要的每个函数?我不太确定在什么情况下对指针函数使用 typedef 会有用。为什么不直接调用 compareints()
呢?询问是因为我有一项作业,无法弄清楚为什么我们需要这样编码。
如有任何帮助,我们将不胜感激。谢谢!
compareints()
returns 两个指针之间的差异,不管这是不是你的意图。如果没有,您可能想试试这个:
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?
没有。函数指针可以指向与指针具有相同签名的任何函数。
函数指针的 Typedef 可能很方便,例如,如果您需要将比较函数传递给通用排序算法。在你的例子中,函数指针是完全没有必要的。
至于转换,任何指针类型都可以隐式转换为 void *
,反之亦然。这是在您调用 compareints()
时完成的。当两个相同类型的指针相减时,返回类型 ptrdiff_t
的值,然后在从 compareints()
.
返回时隐式转换为 int
int compareints(void *a, void *b)
{
return a-b;
}
这 returns 两者之间的区别 pointers a and b
。但是,您得到的值是实现定义的。
要获得它们的值之间的差异,您可以这样做 -
int compareints(void *a, void *b)
{
return *(int *)a-*(int *)b;
}
我正在尝试了解 void 指针和具有 typedef 的函数(在 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 *a
和 void *b
的值,看看它们有什么值,但它说不能,因为 a
是一个空指针。
并且使用 CompareFunc
函数,我是否必须创建一个新变量来指向我想要的每个函数?我不太确定在什么情况下对指针函数使用 typedef 会有用。为什么不直接调用 compareints()
呢?询问是因为我有一项作业,无法弄清楚为什么我们需要这样编码。
如有任何帮助,我们将不胜感激。谢谢!
compareints()
returns 两个指针之间的差异,不管这是不是你的意图。如果没有,您可能想试试这个:
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?
没有。函数指针可以指向与指针具有相同签名的任何函数。
函数指针的 Typedef 可能很方便,例如,如果您需要将比较函数传递给通用排序算法。在你的例子中,函数指针是完全没有必要的。
至于转换,任何指针类型都可以隐式转换为 void *
,反之亦然。这是在您调用 compareints()
时完成的。当两个相同类型的指针相减时,返回类型 ptrdiff_t
的值,然后在从 compareints()
.
int
int compareints(void *a, void *b)
{
return a-b;
}
这 returns 两者之间的区别 pointers a and b
。但是,您得到的值是实现定义的。
要获得它们的值之间的差异,您可以这样做 -
int compareints(void *a, void *b)
{
return *(int *)a-*(int *)b;
}