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 交互时,它仍是不可或缺的手段。
相关文章:
C++中void*知识详解和注意事项
一、void* 是什么? 在 C/C 中,void* 表示一个通用指针类型(generic pointer),可以指向任意类型的对象,但 不能直接解引用或进行算术运算,必须先进行类型转换。 void* ptr; // 可以指向任意类型…...

2024年全国青少年信息素养大赛——算法创意实践挑战赛复赛真题(小学组)——玫瑰花地的面积
2024年全国青少年信息素养大赛——算法创意实践挑战赛复赛真题(小学组)——玫瑰花地的面积 上面试卷可点下方,支持在线编程,在线测评~ 2024年全国信息素养大赛 算法创意实践挑战赛复赛(小学组)_c_少儿编程题库学习中心-嗨信奥 5月17号 全国青…...

【补充笔记】修复“NameError: name ‘ZhNormalizer‘ is not defined”的直接方法
#工作记录 一、问题描述 在运行CosyVoice_For_Windows项目时,出现以下报错: File "F:\PythonProjects\CosyVoice_For_Windows\cosyvoice\cli\frontend.py", line 74, in __init__ self.zh_tn_model ZhNormalizer(remove_erhuaFalse, fu…...

预训练模型实战手册:用BERT/GPT-2微调实现10倍效率提升,Hugging Face生态下的迁移学习全链路实践
更多AI大模型应用开发学习内容,尽在聚客AI学院。 一. 预训练模型(PTM)核心概念 1.1 什么是预训练模型? 预训练模型(Pre-trained Model, PTM)是在大规模通用数据上预先训练的模型,通过自监督学…...
并发笔记-给数据上锁(二)
文章目录 核心挑战 (The CRUX)29.1 并发计数器 (Concurrent Counters)1. 简单非并发计数器 (Figure 29.1)2. 同步计数器(单锁版本 - Coarse-Grained Lock, Figure 29.2)3. 可伸缩计数:近似/懒惰计数器 (Approximate/Sloppy Counter, Figure 2…...

mac docker弹窗提示Docker 启动没有响应
一、原因分析 这台笔记电脑是Mac M3操作系统,安装Docker之后,Docker应用程序一直启动不起来。 二、解决办法 sudo rm /Library/PrivilegedHelperTools/com.docker.vmnetd sudo cp /Applications/Docker.app/Contents/Library/LaunchServices/com.docker.vmnetd /Library/Pri…...
每日算法刷题计划Day7 5.15:leetcode滑动窗口4道题,用时1h
一.定长滑动窗口 【套路】教你解决定长滑窗!适用于所有定长滑窗题目! 模版套路 1.题目描述 1.计算所有长度恰好为 k 的子串中,最多可以包含多少个元音字母 2.找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。 3.…...
如何利用 Python 爬虫按关键字搜索京东商品:实战指南
在电商领域,京东作为国内知名的电商平台,拥有海量的商品数据。通过 Python 爬虫技术,我们可以高效地按关键字搜索京东商品,并获取其详细信息。这些信息对于市场分析、选品上架、库存管理和价格策略制定等方面具有重要价值。本文将…...

Ubuntu 22.04搭建OpenStreeMap地址解析服务(保姆级教程)
1.数据准备 1.1.全球数据 下载地址:https://planet.openstreetmap.org/ 1.2.特定区域的数据 下载地址:Geofabrik Download Server 2.安装必要的软件包 2.1.更新系统软件包 sudo apt updatesudo apt upgrade 2.2.安装所需要的软件包 执行下面的命…...

sqli—labs第五关——报错注入
一:判断输入类型 首先测试 ?id1 回显You are in... 渐进测试?id1 报错分析: 出现引号提示——“”,可能是字符型 继续测试?id1--(用注释符修复了语法错误) 回显You are in... 说明就是字符型 因为能用注释符…...

从海洋生物找灵感:造个机器人RoboPteropod,它能在水下干啥?
大家好!在如今人类对水下环境探索不断深入的时代,从水下考古到珊瑚礁考察,各种任务都离不开水下机器人的助力。但传统水下机器人尺寸较大,在狭窄的水下空间施展不开。今天,我们就来认识一款受海洋小生物启发而设计的仿…...

FastAPI系列16:从API文档到TypeScript 前端客户端(SDKs)
从API文档到TypeScript 前端客户端(SDKs) 快速入门生成一个TypeScript 客户端测试生成的TypeScript 客户端 API标签与客户端生成生成带有标签的 TypeScript 客户端 自定义Operation ID使用自定义Operation ID生成TypeScript客户端 在 FastAPI系列15&…...
为什么 Redis 设计为单线程?6.0 版本为何引入多线程?
Redis 6.0引入多线程的核心目的是优化网络I/O处理,通过分离I/O操作与命令执行,在保持数据一致性的前提下,充分利用多核CPU资源提升高并发场景下的性能,同时保持向后兼容性。以下是对Redis单线程设计与6.0版本引入多线程的详细解析…...
C# 使用HttpClient下载文件
本章讲述:如何在C#中使用HttpClient直接从阿里云OSS下载文件。 步骤1: 添加必要的命名空间 using System; using System.IO; using System.Net.Http; 步骤2: 创建下载方法 以下是使用HttpClient下载文件的示例代码: public class OssDownloader {//d…...

CS016-2-unity ecs
目录 【23】射击改进 【24】僵尸生成器 编辑【25】随机行走 【27】射击光效 【23】射击改进 a. 当距离目标太远的时候,要继续移动。而当距离目标到达攻击距离之后,则停止移动。 上图中的if:判断自身和目标的距离是否大于攻击距离&#…...

CST软件对OPERACST软件联合仿真汽车无线充电站对人体的影响
上海又收紧了新能源车的免费上牌政策。所以年前一些伙伴和我探讨过买新能源汽车的问题,小伙伴们基本纠结的点是买插电还是纯电?我个人是很抗拒新能源车的,也开过坐过。个人有几个观点: 溢价过高,不保值。实际并不环保…...

华为2024年报:鸿蒙生态正在取得历史性突破
华为于2025年03月31日发布2024年年度报告。报告显示,华为经营结果符合预期,实现全球销售收入 8,621 亿元人民币,净利润 626 亿元人民币。2024 年研发投入达到 1,797 亿元人民币,约占全年收入的 20.8%,近十年累计投入的…...
策略模式-枚举实现
策略模式的实现方法有很多,可以通过策略类if,else实现。下面是用枚举类实现策略模式的方法。 定义一个枚举类,枚举类有抽象方法,每个枚举都实现抽象方法。这个策略,实现方法是工具类的很实现,代码简单好理解 枚举实现…...
C++中多重继承下的虚表结构
在 C 的多重继承 中,虚表(vtable)结构会变得更加复杂。 一、基础回顾:单继承下的虚表结构 类中含有虚函数 → 编译器生成虚表(每类一张);每个对象有一个隐藏的虚表指针(vptr&#x…...

LabVIEW的CAN通讯测试程序
该程序是基于 NI LabVIEW 平台开发的 CAN(Controller Area Network,控制器局域网)通讯测试程序。主要功能是对 CAN 通讯过程进行模拟、数据传输与验证,确保 CAN 通讯的正常运行和数据的准确传输。 程序详细说明 接口选择ÿ…...

Spring Boot 使用Itext绘制并导出PDF
最终效果 其实可以加分页,但是没有那么精细的需求,所以我最后就没有加,有兴趣的可以尝试下。 项目依赖 <!-- Spring Boot 版本有点老 --> <spring-boot.version>2.3.12.RELEASE</spring-boot.version><!-- 依…...
访问 Docker 官方镜像源(包括代理)全部被“重置连接”或超时
华为云轻量应用服务器(Ubuntu 系统) 遇到的问题是: 🔒 访问 Docker 官方镜像源(包括代理)全部被“重置连接”或超时了,说明你这台服务器的出境网络对这些国外域名限制很严格,常见于华…...
RPC框架源码分析学习(二)
RPC框架源码分析与原理解读 前言 在分布式系统开发中,远程过程调用(RPC)是一项基础且关键的技术。通过对KVstorageBaseRaft-cpp项目RPC模块的源码分析,我深入理解了RPC框架的工作原理和实现细节。本文将从程序员视角分享我的学习心得。 框架概述 本项…...

【测试】BUG
目录 1、描述BUG的要素: 2、BUG的级别 3、BUG的状态的流转 4、与开发产⽣争执怎么办(⾼频考题) 什么是BUG??? 程序与规格说明之间的不匹配才是错误 1、描述BUG的要素: 问题出现的版本、问…...
MongoClient和AsyncIOMotorClient的区别和用法
示例代码: from motor.motor_asyncio import AsyncIOMotorClient from pymongo import MongoClient🔍 这两个库分别是: 名字说明举个例子pymongo.MongoClient同步版 的 MongoDB 客户端(常规阻塞式操作)你在主线程里一…...

Mac 环境下 JDK 版本切换全指南
概要 在 macOS 上安装了多个 JDK 后,可以通过系统自带的 /usr/libexec/java_home 工具来查询并切换不同版本的 Java。只需在终端中执行 /usr/libexec/java_home -V 列出所有已安装的 JDK,然后将你想使用的版本路径赋值给环境变量 JAVA_HOME,…...

Pillow 移除或更改了 FreeTypeFont.getsize() 方法
w, h self.font.getsize(label) # text width, height AttributeError: FreeTypeFont object has no attribute getsize 在Pillow 项目的变更日志里可以查到哪个版本移除了 getsize() 方法,Pillow仓库: Releases python-pillow/Pillow GitHub 因为…...
数据结构中链表的含义与link
在数据结构中,链表是一种常见的数据结构,它由一组节点组成,每个节点包含两部分:数据部分和指针部分。指针部分用于指向下一个节点的地址。这种结构允许高效的插入和删除操作。 链表的节点表示 链表节点的基本结构可以用以下伪代码表示: Node {data // 存储的数据next /…...

视频编辑软件无限音频、视频、图文轨
威力导演APP的特色功能包括无限音频、视频、图文轨,以及上百种二/三维特技转场、音/视频滤镜和多种音视频混编输出。此外,它还支持实时高清HDV格式、模拟信号输出,并具有DV25、DVACM、DV、HDV输入和输出等功能。在视频编辑领域,威…...
NVMe-oF(NVMe over Fabrics)
技术背景与定义 传统存储协议(如iSCSI、FC)无法发挥NVMe SSD性能(如延迟<100μs、IOPS>100万)。NVMe-oF(NVMe over Fabrics)由NVM Express组织于2016年发布,将NVMe协议从本地访问扩展到了…...