当前位置: 首页 > backend >正文

C++中void*知识详解和注意事项

一、void* 是什么?

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

void* ptr; // 可以指向任意类型,但不能直接使用

二、常见用途

1. 通用函数参数(例如 C 风格 API)

void printValue(void* data, char type) {if (type == 'i') {std::cout << *(int*)data << std::endl;} else if (type == 'f') {std::cout << *(float*)data << std::endl;}
}

2. C 接口中的回调函数传参

pthread_create() 或一些库函数会使用 void* 传递参数。

void* myThreadFunc(void* arg) {int* data = (int*)arg;std::cout << "Thread data: " << *data << std::endl;return nullptr;
}

3. 动态内存和数据结构封装(如 C 语言实现链表)


三、使用 void* 的注意事项

注意点说明
❌ 不可解引用*ptr 是非法的,除非转换为具体类型:*(int*)ptr
❌ 不知道大小sizeof(void*) 是指针大小,而非它指向的对象大小
❌ 不能做指针运算ptr + 1 是非法的
✅ 必须手动强制转换使用前必须 static_cast 或 C 风格强制类型转换
✅ 避免在现代 C++ 中滥用优先考虑模板、std::variant 或虚函数代替

四、C++ 示例代码(完整示范)

#include <iostream>
#include <string>void printValue(void* data, char type) {switch (type) {case 'i':std::cout << "int: " << *(int*)data << std::endl;break;case 'f':std::cout << "float: " << *(float*)data << std::endl;break;case 's':std::cout << "string: " << *(std::string*)data << std::endl;break;default:std::cout << "Unknown type" << std::endl;}
}int main() {int i = 42;float f = 3.14f;std::string s = "Hello";printValue(&i, 'i');printValue(&f, 'f');printValue(&s, 's');return 0;
}

输出:

int: 42
float: 3.14
string: Hello

五、现代 C++ 替代方案

现代 C++ 不推荐频繁使用 void*,可替代选项包括:

替代方式说明
std::any任意类型存储,类型安全但有开销
std::variant类型受限但更高效,适合多类型分发
模板泛型用于写通用函数,如 template<typename T>
虚函数 + 多态对象行为抽象,面向对象设计更合理

总结

优点缺点
通用性强、兼容 C 接口安全性差、容易出错
简洁灵活类型信息丢失、无法自动类型推导

写 C++ 项目时不建议广泛使用 void*,但在与底层 C 库、系统 API 交互时,它仍是不可或缺的手段。


http://www.xdnf.cn/news/5883.html

相关文章:

  • 主流高防服务器技术对比与AI防御方案实战
  • 网络协议分析 实验三 ARP与ARP欺骗
  • Room持久化库:从零到一的全面解析与实战
  • 需求管理缺乏持续改进机制,如何建立
  • nginx配置负载均衡
  • 王炸组合!STL-VMD二次分解 + Informer-LSTM 并行预测模型
  • 黑马Java基础笔记-10
  • 撤回不了一点 v1.0.2,支持微信QQ钉钉飞书等消息防撤回
  • 【图像处理基石】如何入门OCR技术?
  • 2025年PMP 学习十 -第8章 项目质量管理(8.1,8.2)
  • “端 - 边 - 云”三级智能协同平台的理论建构与技术实现
  • 【Linux】操作系统入门:冯诺依曼体系结构
  • python中的单例与实例
  • Python基础学习-Day23
  • SQL server数据库实现远程跨服务器定时同步传输数据
  • containerd 之使用 ctr 和 runc 进行底层容器操作与管理
  • mysql5.7安装
  • 视频监控汇聚平台EasyCVR安防监控系统:在应用中,机房及监控系统施工如何有效实现防雷?
  • huggingface transformers中Dataset是一种什么数据类型
  • spaCy基础入门
  • transforms.Compose()
  • ARFoundation 图片识别,切换图片克隆不同的追踪模型
  • Rodrigues旋转公式-绕任意轴旋转
  • Excel宏和VBA的详细分步指南
  • Linux系统:文件系统前言,详解CHSLBA地址
  • 如何创建maven项目
  • java之网络编程
  • uniapp(vue3)动态计算swiper高度封装自定义hook
  • SD-HOST Controller design-----SD CLK 设计
  • 深度学习之优化器【从梯度下降到自适应学习率算法】(pytorch版)