c/c++中void定义的空类型指针(void* p)要怎么使用(强制类型转换)以及使用场景(函数指针)

我们先看看下面的代码,p是一个void类型的指针,ch是一个char类型的变量,当我们用p来保存ch的地址时,我们却无法通过*p来对ch的值进行访问,因为char会自动转化为void*类型的指针,也就是空类型指针,空类型指针++(无类型可以是任意类型)++,只存储地址的值,丢失类型,无法访问,要访问其值,就要对这个指针进行强制类型转换

char* p1 = (char*)p;
printf("p1 指向的字符是: %c\n",*p1);//值为a

通过这段代码就能对ch的值进行访问了

复制代码
int main(void) {
		int arr[] = { 1,2,3,4,5 };
		char ch = 'a';
		void* p = arr; //定义了一个void 类型的指针
	    p = &ch;//其它类型会自动转换成void *指针
		printf("p: 0x%p ch: 0x%p\n", p, &ch);//结果是p和ch的地址相同且都能打印出来
		//强制类型转化
		char* p1 = (char*)p;
		printf("p1 指向的字符是:  %c\n",*p1);
	
     system("pause");
     return 0;
}

那么什么时候会用到空指针类型呢?请看下面

void 指针可以指向任意类型的数据,不受数据类型限制,可以在程序中给我们带来一些好处,函数中形参为指针类型时,我们可以将其定义为 void 指针,这样函数就可以接受任意类型的指针。如:

典型的如内存操作函数 memcpy 和 memset 的函数原型分别为:

复制代码
复制代码
void * memcpy(void *dest, const void *src, size_t len);

void * memset ( void * buffer, int c, size_t num );

这样,任何类型的指针都可以传入 memcpy 和 memset 中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型

相关推荐
胡斌附体7 分钟前
qt socket编程正确重启tcpServer的姿势
开发语言·c++·qt·socket编程
GalaxyPokemon17 分钟前
Muduo网络库实现 [十] - EventLoopThreadPool模块
linux·服务器·网络·c++
守正出琦22 分钟前
日期类的实现
数据结构·c++·算法
ChoSeitaku25 分钟前
NO.63十六届蓝桥杯备战|基础算法-⼆分答案|木材加工|砍树|跳石头(C++)
c++·算法·蓝桥杯
白露与泡影31 分钟前
Java面试题及答案整理( 2025年 4 月最新版,持续更新)
java·开发语言
YueiL41 分钟前
C++入门练习之 给出年分m和一年中的第n天,算出第n天是几月几号
开发语言·c++·算法
冷凝女子1 小时前
【QT】获取文件路径中的文件名,去掉后缀,然后提取文件名中的数字
开发语言·数据库·qt
我不想当小卡拉米1 小时前
C++:继承+菱形虚拟继承的一箭双雕
开发语言·jvm·c++
weixin_457885821 小时前
JavaScript智能对话机器人——企业知识库自动化
开发语言·javascript·自动化
机器视觉知识推荐、就业指导1 小时前
QML 批量创建模块 【Repeater】 组件详解
前端·c++·qml