鱼C论坛

 找回密码
 立即注册
查看: 1705|回复: 2

[已解决]void指针解引用的问题

[复制链接]
发表于 2023-11-3 23:02:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
课堂上说,void指针不能解引用,否则报错。为什么我这个没有警告和报错?
  1. #include "stdio.h"

  2. int main()
  3. {
  4.     int num = 100;
  5.     int* pnum = #
  6.     void* vd;
  7.     char* ps = (char*)"Hahaly";
  8.    
  9.     vd = pnum;
  10.     printf("num = %d\n", *pnum);

  11.     vd = ps;
  12.     printf("ps= %s\n", vd);     

  13.     return 0;
  14. }
复制代码
最佳答案
2023-11-3 23:04:05
在C或C++中,void* 是一种特殊的指针类型,称为“通用指针”或“无类型指针”。它可以接收任意类型的指针,并且可以被强制转换为其他类型的指针。虽然void* 指针本身不能进行解引用操作,但是在特定情况下,通过将void*指针转换为正确的类型后,是可以进行解引用的。

在您提供的代码中,虽然 vdvoid* 类型的指针,但在第一次赋值时,将 pnum 的地址赋给了 vd。因为 pnumint* 类型的指针,所以这里的类型匹配是可以通过编译的。在第二次赋值时,将 ps 的地址赋给了 vd。同样地,因为 pschar* 类型的指针,也是可以进行类型匹配的。

在打印输出时,您使用了 printf 函数,对 vd 进行了解引用。这就涉及到了类型转换的问题:将 void* 指针转换为正确的指针类型再进行解引用操作。在这里,尽管 vdvoid* 指针,但因为之前的赋值操作中已经将 pnumps 的地址赋给了 vd,所以在打印 *pnumvd 的值时,并没有出现警告或报错。

需要注意的是,在实际使用中,为了确保类型安全,最好在使用 void* 指针进行解引用之前,将其转换为正确的指针类型。这有助于避免代码错误和潜在的问题。

希望能解答您的疑问!如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-11-3 23:03:23 | 显示全部楼层
在这段代码中,void指针被用来存储不同类型的指针,包括int指针和char指针。虽然void指针本身不能被解引用,但是在特定的上下文中,我们可以将void指针转换为其他类型的指针,并对其进行解引用。

在代码中,首先定义了一个int类型的变量num,并创建了一个指向num的int指针pnum。然后,定义了一个void指针vd。接着,将pnum的值赋给vd,这是允许的,因为vd可以存储任何类型的指针。然后,通过解引用pnum指针,我们可以打印出num的值。

接下来,将一个char类型的字符串字面量强制转换为char指针,并将其赋给vd。同样地,虽然vd是void指针,但是我们可以将其转换为char指针,并通过解引用打印出字符串的值。

虽然这段代码没有警告或报错,但是在实际开发中,我们应该谨慎使用void指针的转换和解引用操作,以避免类型错误和潜在的问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-3 23:04:05 | 显示全部楼层    本楼为最佳答案   
在C或C++中,void* 是一种特殊的指针类型,称为“通用指针”或“无类型指针”。它可以接收任意类型的指针,并且可以被强制转换为其他类型的指针。虽然void* 指针本身不能进行解引用操作,但是在特定情况下,通过将void*指针转换为正确的类型后,是可以进行解引用的。

在您提供的代码中,虽然 vdvoid* 类型的指针,但在第一次赋值时,将 pnum 的地址赋给了 vd。因为 pnumint* 类型的指针,所以这里的类型匹配是可以通过编译的。在第二次赋值时,将 ps 的地址赋给了 vd。同样地,因为 pschar* 类型的指针,也是可以进行类型匹配的。

在打印输出时,您使用了 printf 函数,对 vd 进行了解引用。这就涉及到了类型转换的问题:将 void* 指针转换为正确的指针类型再进行解引用操作。在这里,尽管 vdvoid* 指针,但因为之前的赋值操作中已经将 pnumps 的地址赋给了 vd,所以在打印 *pnumvd 的值时,并没有出现警告或报错。

需要注意的是,在实际使用中,为了确保类型安全,最好在使用 void* 指针进行解引用之前,将其转换为正确的指针类型。这有助于避免代码错误和潜在的问题。

希望能解答您的疑问!如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 03:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表