int main()
{
int b = 12;
void *ptr = &b;
printf("%d", *ptr);
return 0;
}
我期望这段代码会打印出12,但是它没有。 如果我们定义一个int指针而不是void指针,它就可以工作了。 我想知道如何使用void指针并打印分配给它的地址和其中保存的量?
对 void *
进行解引用是没有意义的,因为它无法知道指向内存的类型。
您需要将其转换为指向 int *
的指针,然后才能对其进行解引用。
printf("%d", *((int *)ptr));
void *
指向什么类型数据的信息。 - dbush空指针不能被解引用。这会导致以下警告:
编译器错误:'void' 不是一个对象指针类型*
因此,你需要像这样操作。
#include<stdio.h>
int main()
{
int b = 12;
void *ptr = &b;
printf("%d", *(int *)ptr);
return 0;
}
qsort
。void qsort(void *base,
size_t nitems,
size_t size,
int (*compar)(const void *, const void*)
);
base
只是第一个元素的指针。它是void指针的原因是,无论类型如何,qsort都可以用于任何列表。 nitems
是列表中项目的数量,size
是每个元素的大小。到目前为止都还好理解。 qsort
能够对任何列表进行排序。但由于它应该是通用的,所以它采用两个void指针作为参数。这是一个比较庞大的示例比较函数,仅供参考:int cmpfloat(const void *a, const void *b) {
const float *aa = (float*) a;
const float *bb = (float*) b;
if(*aa == *bb) {
return 0;
} else if(*aa > *bb) {
return 1;
} else {
return -1;
}
}
很清楚正在发生什么。如果a>b,它返回正数,如果它们相等,则返回零;如果b>a,则返回负数,这是要求。实际上,我只会写成这样:
int cmpfloat(const void *a, const void *b) {
return *(float*)a - *(float*)b;
}
float arr[5] = {5.1, 3.4, 8.9, 3.4, 1.3};
qsort(arr, 5, sizeof *arr, cmpfloat);
p
的类型为 void *
,那么表达式 *p
的类型为 void
,表示“没有值”。你不能将 void
表达式传递给 printf
的 %d
转换说明符(或任何其他转换说明符)。void *
,必须先将其转换为适当类型的指针。您可以使用强制转换来完成:printf( "%d\n", *(int *) ptr );
int *p = ptr;
printf( "%d\n", *p );
void
指针的规则很特殊,它们可以被分配给其他指针类型而不需要显式转换 - 这使它们可以用作“通用”指针类型。但是,您不能直接查看void
指针指向的内容。
void*
进行解引用会得到void
,它是一个“不完整”的类型。也就是说,编译器不知道如何处理它。 - Eugene Sh.void*
未被指定为有效操作。 - chux - Reinstate Monicavoid *
,原始指针中“保存的数量”将会丢失,您可以使用void
指针并打印其分配的地址以及其中保存的数量。 - chux - Reinstate Monica