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

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 中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型


http://www.kler.cn/news/356051.html

相关文章:

  • Flink 06 聚合操作入门学习,真不难
  • 智慧校园电子班牌系统全套源码,SpringBoot框架结合Java后端,Vue.js前端,移动端小程序使用原生语言开发,电子班牌固件基于Android系统
  • 面试题收集-Redis的关键知识点
  • U盘不显示文件但有占用空间:深度解析与高效恢复策略
  • VSCode中的TypeScript教程
  • adb devices没找到安卓设备的解决办法
  • Therabody携第二代沉浸式身心平衡眼环引领放松黑科技
  • JavaWeb 23.一文速通npm的配置和使用
  • 开源 AI 智能名片 2+1 链动模式 S2B2C 商城小程序的场景营销架构探索
  • 名词释义:通风天窗喉口宽度
  • 前端面试题17 | 什么是vue的响应式?
  • el-table修改指定列字体颜色 ,覆盖划过行的高亮显示文字颜色
  • 【CS常见问题】你用的是VS2019,最高支持.NET5.0,但是项目将.NET6.0设为目标无法运行,怎么办?
  • 【java面经thinking】二
  • Android -- [SelfView] 炫酷文字圆盘时钟
  • [渗透测试] XSS跨站点脚本攻击 零基础入门教程
  • 单细胞空间转录组分析流程学习python版(三)
  • 你是否真的弄懂了 OAuth 2.0?
  • 某MDM主数据管理系统与微软Dynamic CRM系统(国内节点)集成案例
  • 深入理解WPF中的数据绑定:完整指南