鱼C论坛

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

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

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

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

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

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;
}
最佳答案
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* 指针进行解引用之前,将其转换为正确的指针类型。这有助于避免代码错误和潜在的问题。

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

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> 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指针的转换和解引用操作,以避免类型错误和潜在的问题。
想知道小甲鱼最近在做啥?请访问 -> 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* 指针进行解引用之前,将其转换为正确的指针类型。这有助于避免代码错误和潜在的问题。

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

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-5 15:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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