马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
课堂上说,void指针不能解引用,否则报错。为什么我这个没有警告和报错?#include "stdio.h"
int main()
{
int num = 100;
int* pnum = #
void* vd;
char* ps = (char*)"Hahaly";
vd = pnum;
printf("num = %d\n", *pnum);
vd = ps;
printf("ps= %s\n", vd);
return 0;
}
在C或C++中, void* 是一种特殊的指针类型,称为“通用指针”或“无类型指针”。它可以接收任意类型的指针,并且可以被强制转换为其他类型的指针。虽然 void* 指针本身不能进行解引用操作,但是在特定情况下,通过将 void*指针转换为正确的类型后,是可以进行解引用的。
在您提供的代码中,虽然 vd 是 void* 类型的指针,但在第一次赋值时,将 pnum 的地址赋给了 vd。因为 pnum 是 int* 类型的指针,所以这里的类型匹配是可以通过编译的。在第二次赋值时,将 ps 的地址赋给了 vd。同样地,因为 ps 是 char* 类型的指针,也是可以进行类型匹配的。
在打印输出时,您使用了 printf 函数,对 vd 进行了解引用。这就涉及到了类型转换的问题:将 void* 指针转换为正确的指针类型再进行解引用操作。在这里,尽管 vd 是 void* 指针,但因为之前的赋值操作中已经将 pnum 和 ps 的地址赋给了 vd,所以在打印 *pnum 和 vd 的值时,并没有出现警告或报错。
需要注意的是,在实际使用中,为了确保类型安全,最好在使用 void* 指针进行解引用之前,将其转换为正确的指针类型。这有助于避免代码错误和潜在的问题。
希望能解答您的疑问!如果还有其他问题,请随时提问。
球一个最佳答案谢谢啦!这对我非常重要!
|