我一直在玩C中的类型转换。特别是,我(跟随K& R)试图实现一个程序,它将采用“一般”类型的输入(具体来说,K& R实现了qsort,用于对通用数据的指针数组进行排序)。这样做,我遇到了以下问题:
#include <stdio.h>
int comp(int *a, int *b); //*a == *b
main()
{
int a = 2;
int b = 3;
int *pa = &a;
int *pb = &b;
int (*pfunc)(void *, void *) = (int (*)(void *, void *)) comp;
int fin = (*pfunc)((void *)pa, (void *)pb);
printf("%d \n", fin);
}
这很合适,并且做了你可能期望它做的事情。问题是:
#include <stdio.h>
main()
{
int a = 2;
int b = 3;
int *pa = &a;
int *pb = &b;
void *pVoid_a = (void *) pa;
void *pVoid_b = (void *) pb;
int fin_Void = (*pVoid_a == *pVoid_b);
}
不起作用。
为什么这是一个问题:据我所知,在类型转换中
int (*pfunc)(void *, void *) = (int (*)(void *, void *)) comp;
指针“comp”的副本,除了该副本指向的函数接受参数“void *”而不是“int *”,并被赋值给变量“pfunc”。否则,pfunc和comp的行为方式相同。 (我想我在这里肯定是错的,但我不确定为什么)
当在第一个程序中,(void *)pa和(void *)pb传递给pfunc时,我希望可以制作两个pa和pb副本,但这些副本现在是类型的(void) *)并分配给不同的名字。这些副本通过pcomp发送,返回的值打印等
我试图在第二个程序中重新创建这个过程,除了它不起作用!出于某种原因,在pVoid_a和pVoid_b传递给pfunc之后的第一个程序中,它们最终在函数体中表现得像“int *”,即使看起来它们没有任何理由。为什么pVoid_a和pVoid_b在第一个程序中恢复它们的“int”行为,而不是在第二个程序中?
答案 0 :(得分:2)
您在第一个程序中观察到的行为是因为void*
类型的任何变量被隐式转换为任何其他指针类型。在第二个程序中,您需要明确说明要将pVoid_a
和pVoid_b
转换为哪种指针类型,否则您将取消引用void*
这是没有意义的。修复:
int fin_Void = (*(int*)pVoid_a == *(int*)pVoid_b);