在什么情况下,我们应该选择void指针而不是char指针,反之亦然?
实际上,这两种类型都可以强制转换为任何数据类型。
实际上,这两种类型都可以强制转换为任何数据类型。
void
指针是指向"任何类型"的指针,在进行解除引用操作前需要将其转换为实际类型的指针。
char
指针是指向char
的指针,它可以用于访问其他类型的(部分)数据。
当意义是"任何类型"(或几种类型等)时应使用 void *
,当你需要以原始字节形式访问char
或其他类型的各个字节时应使用char *
。
使用void*
但请记住,标准禁止对void*进行指针运算,您无法对void*进行解引用操作,并且void*还存在其他限制。因此,最好始终将void*转换为一些有意义的指针,以避免问题。
使用char*
当您使用char类型时或
当您希望以逐字节方式处理某种类型时,请使用char。由于sizeof(char)始终为1字节,如果您对其进行递增/递减操作,char*指针会按照一个字节的距离改变(分别指向内存中的下一个/前一个字节)。
当指针所引用的变量类型未知时,会使用void指针。例如,malloc()函数返回一个指向分配内存的void指针。然后,您可以将指针转换为其他数据类型。
有时候您只需要创建一个指针来存储地址,这时可以使用void指针。
这更多关乎代码的可读性和结构,我不想看到一个函数需要输入指向结构体的指针并通过 char* 获取它,如果我看到 char*,我脑海中首先想到的是字符串(在纯 C 术语中,字符数组,以 null 结尾),另一方面,使用 void*,我会被警告将传递一些通用的东西,一个很好的例子是 qsort
函数。
所以这不仅仅是关于它是否工作或编译,它也应该是可读的。
void
指针。 - Paul Ogilvieconst
限定符,即使你只需简单地不对其进行赋值就可以“实现相同的功能”。但是能够传达意义(无论是对人类读者还是编译器)本身就具有价值。 - Arkku