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

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 交互时,它仍是不可或缺的手段。


相关文章:

  • LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
  • Pytorch张量和损失函数
  • Java详解LeetCode 热题 100(15):LeetCode 189. 轮转数组(Rotate Array)详解
  • 工程类论文查重困局破解:基于知识图谱的跨学科语义重构技术实证研究
  • 通讯录程序
  • 利用比较预言机处理模糊的偏好数据
  • Java Spring MVC -01
  • [Java实战]Spring Boot 3 整合 Apache Shiro(二十一)
  • 多模态融合【十九】——MRFS: Mutually Reinforcing Image Fusion and Segmentation
  • GOOSE 协议中MAC配置
  • CVE-2025-31258 macOS远程视图服务沙箱逃逸漏洞PoC已公开
  • JAVA研发+前后端分离,ZKmall开源商城B2C商城如何保障系统性能?
  • 使用scp命令拷贝hadoop100中文件到其他虚拟机中
  • 深度学习之优化器【从梯度下降到自适应学习率算法】(pytorch版)
  • C语言| extern的用法作用
  • TB67S109AFTG, TB67S109AFNG是一款采用PWM斩波器的两相双极步进电机驱动器内置有时钟输入解码器。采用BiCD工艺制造
  • java刷题基础知识
  • 如何通过 Windows 图形界面找到 WSL 主目录
  • 玩转ChatGPT:DeepSeek实战(统一所在地格式)
  • EMQX v5.0通过连接器和规则同步数据
  • 广东省原省长卢瑞华逝世,享年88岁
  • 人民日报评外卖平台被约谈:合法规范经营,公平有序竞争
  • 新能源汽车,告别混乱创新
  • 中国女足将于5月17日至6月2日赴美国集训并参加邀请赛
  • 《广州大典研究》集刊发展座谈会:“广州学”的传承与创新
  • 宁德时代港股募资预计最高至50亿美元:90%将投向匈牙利项目