qidao123.com ToB IT社区-企服评测·应用市场

标题: C++中void*知识详解和留意事项 [打印本页]

作者: 张国伟    时间: 2025-9-2 02:25
标题: C++中void*知识详解和留意事项
一、void* 是什么?

在 C/C++ 中,void* 表示一个通用指针范例(generic pointer),可以指向任意范例的对象,但 不能直接解引用或进行算术运算,必须先辈行范例转换。
  1. void* ptr; // 可以指向任意类型,但不能直接使用
复制代码

二、常见用途

1. 通用函数参数(比方 C 风格 API)
  1. void printValue(void* data, char type) {
  2.     if (type == 'i') {
  3.         std::cout << *(int*)data << std::endl;
  4.     } else if (type == 'f') {
  5.         std::cout << *(float*)data << std::endl;
  6.     }
  7. }
复制代码
2. C 接口中的回调函数传参

如 pthread_create() 或一些库函数会使用 void* 通报参数。
  1. void* myThreadFunc(void* arg) {
  2.     int* data = (int*)arg;
  3.     std::cout << "Thread data: " << *data << std::endl;
  4.     return nullptr;
  5. }
复制代码
3. 动态内存和数据结构封装(如 C 语言实现链表)


三、使用 void* 的留意事项

留意点分析❌ 不可解引用*ptr 是非法的,除非转换为具体范例:*(int*)ptr❌ 不知道巨细sizeof(void*) 是指针巨细,而非它指向的对象巨细❌ 不能做指针运算如 ptr + 1 是非法的✅ 必须手动逼迫转换使用前必须 static_cast 或 C 风格逼迫范例转换✅ 避免在现代 C++ 中滥用优先思量模板、std::variant 或虚函数取代
四、C++ 示例代码(完整示范)
  1. #include <iostream>
  2. #include <string>
  3. void printValue(void* data, char type) {
  4.     switch (type) {
  5.         case 'i':
  6.             std::cout << "int: " << *(int*)data << std::endl;
  7.             break;
  8.         case 'f':
  9.             std::cout << "float: " << *(float*)data << std::endl;
  10.             break;
  11.         case 's':
  12.             std::cout << "string: " << *(std::string*)data << std::endl;
  13.             break;
  14.         default:
  15.             std::cout << "Unknown type" << std::endl;
  16.     }
  17. }
  18. int main() {
  19.     int i = 42;
  20.     float f = 3.14f;
  21.     std::string s = "Hello";
  22.     printValue(&i, 'i');
  23.     printValue(&f, 'f');
  24.     printValue(&s, 's');
  25.     return 0;
  26. }
复制代码
输出:
  1. int: 42
  2. float: 3.14
  3. string: Hello
复制代码

五、现代 C++ 替代方案

现代 C++ 不保举频繁使用 void*,可替代选项包括:
替代方式分析std::any任意范例存储,范例安全但有开销std::variant范例受限但更高效,得当多范例分发模板泛型用于写通用函数,如 template<typename T>虚函数 + 多态对象行为抽象,面向对象设计更公道
总结

长处缺点通用性强、兼容 C 接口安全性差、轻易出错轻巧机动范例信息丢失、无法主动范例推导在 写 C++ 项目时不发起广泛使用 void*,但在与底层 C 库、体系 API 交互时,它还是不可或缺的本事。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com ToB IT社区-企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.5