void指针
本节阅读量:void指针也称为泛型指针,是一种特殊类型的指针,可以指向任何数据类型的对象!使用void关键字作为指针类型即可声明void指针:
|
|
void指针可以指向任何数据类型的对象:
|
|
然而,由于void指针不知道自己所指向对象的类型,因此直接解引用void指针是非法的。也就是说,在解引用之前,必须先将void指针转换为其他指针类型。
|
|
这将打印:
|
|
接下来一个显而易见的问题是:如果void指针不知道它所指向的是什么,我们如何知道应该将它强制转换为什么类型?这取决于您的自定义代码逻辑,也可以为void指针附带一个标签。
下面是一个使用void指针的示例:
|
|
该程序打印:
|
|
void指针杂项
void指针可以设置为空值:
|
|
由于void指针不知道自己所指向对象的类型,因此delete void指针将导致未定义的行为。如果需要删除void指针,请先使用static_cast将其转换回适当的类型。
不能对void指针进行指针运算。这是因为指针运算要求指针知道所指向对象的大小,这样才能正确地增加或减小指针值。
请注意,并不存在所谓的void引用。这是因为void引用的类型为void&,它完全不知道所引用值的类型。
结论
通常,除非绝对必要,否则最好避免使用void指针,因为它会绕过类型检查。这可能让您在无意中做出没有意义的操作,而编译器不会对此发出警告。例如,以下代码是有效的:
|
|
但谁知道结果会是什么呢!
尽管上述函数似乎是一种让单个函数处理多种数据类型的简洁方法,但C++实际上提供了更好的方式来完成相同操作(通过函数重载)。函数重载会保留类型检查,从而帮助防止误用。许多过去使用void指针来处理多种数据类型的场景,现在最好改用模板完成,模板同样提供强类型检查。
不过,偶尔您仍然可能会遇到void指针的合理用法。但在使用之前,请先确认没有更好(更安全)的语言机制可以完成同样的事情!
习题
问题 1
void指针和空指针有什么区别?
查看答案
void指针是一种可以指向任何类型对象、但不知道自己所指向对象类型的指针。要对void指针解引用,必须先把它显式转换成其他类型的指针。空指针是不指向任何地址的指针。void指针可以是空指针。
因此,void指针描述的是指针的类型,而空指针描述的是指针的值(地址)。