hanghanga 发表于 2023-11-3 23:02:49

void指针解引用的问题

课堂上说,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;
}

isdkz 发表于 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指针的转换和解引用操作,以避免类型错误和潜在的问题。

Mike_python小 发表于 2023-11-3 23:04:05

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

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

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: void指针解引用的问题