空类型(void *)的简单理解
(void *)是一个指针类型,又名空指针/空类型指针/无类型指针。既然是指针那么它就是一个存地址的变量!32位系统下sizeof(ptr)就是4字节,64位系统下sizeof(ptr)就是8字节(注:这个ptr可以使各种类型的指针,均是如此)。因此判断一个系统位数的最科学方法就是sizeof(ptr)。见程序1。
C中规定void类型的指针可以强制转化为任意的其他类型指针使用。原因其实就是前面说的其占的空间就是4或者8个字节,所以不管什么类型的指针都可以强制转换的。其实指针类型的意义在于告诉编译器要同时取得该地址后处理该地址的时候往后延伸几个字节。例如一个指针p的值是0x0041FF10如果它是int *类型,那么用*p的时候,就会把0x0041FF10开始的sizeof(int)个字节一起读出来,按int类型的存储方法解析出它的值;如果它是double*类型那么用*p的时候,就会把0x0041FF10开始的sizeof(double)个字节一起读出来,按double类型的存储方法解析出它的值。所以把各种类型的指针转换成void *类型然后在转换回来肯定是没有任何问题的了。见程序2
那么问题来了什么情况下需要这么个东西呢?答案:主要是你不知道他是什么个类型的时候。比如malloc的返回值,对于malloc函数而言他并不知道你想申请的指针类型到底是什么,所以返回void *指针再好不过了。其实对于void *指针我们应当尽快的把他转换成相应类型的指针,不要长时间处于无类型的状态。
实际应用中更多是在参数传递的时候用到void *指针,尤其是多线程。在这里你可以把任何结构体的地址转为void *传递,到用到的时候在转回来。
注:
C中可以从采用(void *)/(int *)的方式从int *到void*,但是反过来不行。
C++中倒是可以从(void *)转向(int *),但采用的是static_cast。
C++中string类型不可以简单的在前面直接加上(void *)转换成(void *)。但是可以先转换成char*类型[.c_str()],然后再转换成(void *)。
程序1:
#include <iostream>
using namespace std;int main(){cout<<"sizoof(void *)="<<sizeof(void *)<<endl;//64位Linux返回8cout<<"sizeof(int*)="<<sizeof(int*)<<endl;//8cout<<"sizeof(double*)="<<sizeof(int*)<<endl;//8cout<<"sizeof(int)="<<sizeof(int)<<endl;//4
}返回结果如下:
sizoof(void *)=8
sizeof(int*)=8
sizeof(double*)=8
sizeof(int)=4
程序2:
#include <stdio.h>
#include <string.h>
int main(){int a=11; int *p1=&a;double b=2.2; double *p2=&b;char c[]="aaaaa"; char *p3=c;//string d="bbbbb"; char *p4=NULL;char *p5=NULL;printf("%s\n",c);//转换成void *类型void * pv1=(void *)p1;void * pv2=(void *)p2;void * pv3=(void *)p3;//void * pv4=(void *)d.c_str();void * pv5=(void *)"ccccc";//转换回原来的类型p1=(void *)pv1;p2=(void *)pv2;p3=(void *)pv3;//p4=(void *)d.c_str()";p5=(void *)"ccccc";//p1=static_cast<int*>(pv1);//p2=static_cast<double*>(pv2);//p3=static_cast<char*>(pv3);//p4=static_cast<char*>(pv4);//p5=static_cast<char*>(pv5);printf("%d\n",*p1);printf("%f\n",*p2);printf("%s\n",p3);printf("%s\n",p5);
}程序二结果如下:aaaaa
11
2.200000
aaaaa
ccccc
空类型(void *)的简单理解相关推荐
- 空类型指针(void *)的理解
void指针是空类型指针,它不指向任何类型,即void指针仅仅是一个地址,所以空类型指针不能进行指针运算,也不能进行间接引用(因为指针运算和间接引用都需要指针的类型信息). 例如: void * p; ...
- python表示空类型的关键字_Python 为什么没有 void 关键字?
原标题:Python 为什么没有 void 关键字? void 是编程语言中最常见的关键字之一,从字面上理解,它是"空的.空集.空白"的意思,最常用于表示函数的一种返回值类型. 维 ...
- [C#基础知识系列]专题十:全面解析可空类型
引言: C# 2.0 中还引入了可空类型,可空类型也是值类型,只是可空类型是包括null的值类型的,下面就介绍下C#2.0中对可空类型的支持具体有哪些内容(最近一直都在思考如何来分享这篇文章的,因为刚 ...
- 还不明白可空类型原理? 我可要挖到底了
一:背景 1. 讲故事 做好自媒体到现在有一个月了,关注我的兄弟应该知道我产出了不少文章,号里的粉丝也多起来了,我也尽最大努力做到有问必回,现在是基础的.高深的问题都接踵而来,可我也只是一只小菜鸟,想 ...
- 关于C语言函数的简单理解
关于C语言函数的简单理解 C语言中的函数 在C语言中,函数是构成程序的基本模块.程序的执行从main()函数的入口开始,到main()函数的出口结束,中间循环.往复.迭代的调用一个有一个函数.每个函数 ...
- Android:安卓学习笔记之Bitmap的简单理解和使用
Android Bitmap的简单理解和使用 Android Bitmap 一.Bitmap的定义 二.Bitmap的格式 2.1 存储格式 2.2 压缩格式 三.Bitmap创建方法 3.1 Bit ...
- 简单理解常量、常量池、运行时常量池和字符串常量池
1.常量 常量在java中就值的是一般的字面量,比如字符串,整数,浮点数等等数据.简单理解java中什么叫常量 2.常量池,也叫静态常量池或者class文件常量池,说常量池一定要指明是编译器产生的.它 ...
- Android:同步屏障的简单理解和使用
同步屏障的简单理解和使用 1.背景 2.何为同步屏障? 2.1. 发送屏障消息--postSyncBarrier 2.2.发送异步消息 2.3.处理消息 2.4.移除屏障消息--removeSyncB ...
- Java:java学习笔记之锁机制的简单理解和使用
锁机制的简单理解和使用 锁机制 1.背景 2.定义 3.锁的种类 4.乐观锁 VS 悲观锁 4.1.悲观锁 4.2.乐观锁 4.3.举例说明 4.4.CAS算法 4.4.1.CAS使用 4.4.2.C ...
- Spring Security并没有那么难嗷 简单理解OAuth2.0
文章目录 1. 基本概念 1.1 什么是认证 1.2 什么是会话 1.3 什么是授权 1.4 授权的数据模型 1.5 RBAC 1.5.1 基于角色的访问控制 1.5.2 基于资源的访问控制 2. 基 ...
最新文章
- 英伟达奔驰共同发布自动驾驶系统,还自带停车功能
- adb命令 android 串口_ADB使用linux命令查看Android的使用情况
- leetcode150. 逆波兰表达式求值
- 从草根到百万年薪程序员的十年风雨之路,吊打面试官系列!
- Redux API之applyMiddleware
- linux修改最大进程,linux 进程数最大值修改方法
- python编辑器和python解释器的区别_python编译器和解释器的区别
- 4.云计算和大数据时代网络揭秘-安全的网络通道-网络加密
- AndroidStudio安卓原生开发_启动系统的activity_短信发送activity_摄像头activity_电话拨打activity---Android原生开发工作笔记94
- 计算机所建造全过程,Midas桥梁建模计算,全过程图文解析!
- javalinux服务器上写文件,java 读取linux服务器上文件
- linux系统TongLinkQ安装部署手册
- c语言中双引号是什么作用,C语言中单引号与双引号的区别
- Dubbo thread pool is exhausted
- Element-UI 上传图片到达一定数量后隐藏图片上传按钮
- 大数据时代,财务管理人员要成为复合型人才
- zblog插件 php,ZBlogSEO插件
- ES6 之 Promise用法详解
- ubuntu中把软件放在桌面
- [附源码]计算机毕业设计校园订餐管理系统Springboot程序
热门文章
- Java中Double保留六位小数_Java中Double保留后小数位的几种方法
- 蓝桥杯2017年第八届C/C++省赛A组第一题-迷宫
- 7-16 装箱问题 (20 分)
- L2-002 链表去重 (25 分)—团体程序设计天梯赛
- Android 实现RecyclerView长按弹出Menu 点击删除
- git本地给远程仓库创建分支
- jsp基础知识点——思维导图
- bzoj1051 [HAOI2006]受欢迎的牛
- Spring源码阅读五 IOC容器初始化之 bean定义载入
- 前端----表格的具体使用(jquery)