我编写了这几行代码,希望它们能正常工作,但我一直收到一个错误,说“无效使用void表达式”,我不知道为什么
int main(){ int a=12; void* ptr = &a; printf("%d",*ptr); }
我认为void指针可以指向任何类型的数据,那么这里有什么问题呢?我甚至尝试将void指针转换为整型指针,但仍然得到相同的错误。
bmvo0sr51#
我认为void指针可以指向任何类型的数据,那么这里有什么问题呢?一个void *可以指向任何类型的data1。但是它只记住地址,而不是类型。要在*中使用它,你必须告诉编译器使用什么类型:
void *
*
int a = 12; void *ptr = &a; printf("%d\n", * (int *) ptr); // Use cast to specify type.
在执行过程中,程序不会记住ptr是从int分配的地址,并且会自动知道在printf调用中加载int。在编译过程中,编译器也不会记住这一点。要使用指针访问数据,必须将其转换回适当的类型,然后使用该类型。
ptr
int
printf
1指针应该保留它所指向的任何对象的所有限定符。指向const int x或volatile int x的指针应该分别赋给const void *p或volatile void *p,而不是没有限定符的void *p。
const int x
volatile int x
const void *p
volatile void *p
void *p
3ks5zfa02#
无法取消引用void指针,基础类型(void)不完整。您应该为指针使用其他类型(如int*),或者应该将void指针强制转换为完整类型(同样,可能是int*)。
void
int*
yks3o0rb3#
正如您所看到的,您不能解引用void*,但是将其强制转换为int*肯定是有效的:
void*
printf("%d",*(int*)ptr);
3条答案
按热度按时间bmvo0sr51#
我认为void指针可以指向任何类型的数据,那么这里有什么问题呢?
一个
void *
可以指向任何类型的data1。但是它只记住地址,而不是类型。要在*
中使用它,你必须告诉编译器使用什么类型:在执行过程中,程序不会记住
ptr
是从int
分配的地址,并且会自动知道在printf
调用中加载int
。在编译过程中,编译器也不会记住这一点。要使用指针访问数据,必须将其转换回适当的类型,然后使用该类型。脚注
1指针应该保留它所指向的任何对象的所有限定符。指向
const int x
或volatile int x
的指针应该分别赋给const void *p
或volatile void *p
,而不是没有限定符的void *p
。3ks5zfa02#
无法取消引用void指针,基础类型(
void
)不完整。您应该为指针使用其他类型(如int*
),或者应该将void指针强制转换为完整类型(同样,可能是int*
)。yks3o0rb3#
正如您所看到的,您不能解引用
void*
,但是将其强制转换为int*
肯定是有效的: