何时使用void指针而不是char指针?

6
在什么情况下,我们应该选择void指针而不是char指针,反之亦然?
实际上,这两种类型都可以强制转换为任何数据类型。

当您想要在模块内隐藏数据结构并向用户提供“指针”以与您的模块交互时,可以使用void指针。 - Paul Ogilvie
感谢@PaulOgilvie的回答,但是我也可以使用char指针实现相同的功能,为什么要使用void指针? - Shubham Pendharkar
3
这有点像问为什么你会在某些东西上使用 const 限定符,即使你只需简单地不对其进行赋值就可以“实现相同的功能”。但是能够传达意义(无论是对人类读者还是编译器)本身就具有价值。 - Arkku
4个回答

10

void 指针是指向"任何类型"的指针,在进行解除引用操作前需要将其转换为实际类型的指针。

char 指针是指向char 的指针,它可以用于访问其他类型的(部分)数据。

当意义是"任何类型"(或几种类型等)时应使用 void * ,当你需要以原始字节形式访问char 或其他类型的各个字节时应使用char *


2

使用void*

  • 当您只想要指向某个地址的指针,并不关心该地址上存储的内容时,请使用void。例如,malloc用于分配动态内存,而malloc不关心您分配内存的类型,因此malloc返回void*,即指向某个内存的指针。

但请记住,标准禁止对void*进行指针运算,您无法对void*进行解引用操作,并且void*还存在其他限制。因此,最好始终将void*转换为一些有意义的指针,以避免问题。

使用char*

  • 当您使用char类型时或

  • 当您希望以逐字节方式处理某种类型时,请使用char。由于sizeof(char)始终为1字节,如果您对其进行递增/递减操作,char*指针会按照一个字节的距离改变(分别指向内存中的下一个/前一个字节)。


1

当指针所引用的变量类型未知时,会使用void指针。例如,malloc()函数返回一个指向分配内存的void指针。然后,您可以将指针转换为其他数据类型。

有时候您只需要创建一个指针来存储地址,这时可以使用void指针。


-1

这更多关乎代码的可读性和结构,我不想看到一个函数需要输入指向结构体的指针并通过 char* 获取它,如果我看到 char*,我脑海中首先想到的是字符串(在纯 C 术语中,字符数组,以 null 结尾),另一方面,使用 void*,我会被警告将传递一些通用的东西,一个很好的例子是 qsort 函数。
所以这不仅仅是关于它是否工作或编译,它也应该是可读的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接