再次认识void
重新认识void
在初学c/c++时感觉void是一个很不起眼的关键字。因为在c++中我使用的还是比较少的。但是到了Linux中,不论是在内核源码中还是在程序编写的过程中有关void与*的组合随处可见,为了搞清楚、弄明白,具体的原理我写下此博客。
void的定义
void简单描述“无类型”用作限定的作用。例如:
//限制返回值
void swap(int &a, int &b) //限定函数的返回值为空。
{
int temp;
temp = a;
a = b;
b = temp;
}
//限制参数类型
int prompt(void) //不需要参数传递
{
cout<<"到此结束"<<endl;
return 0;
}
注意:不要允许使用void去定义变量的类型
例如:
#include<iostream>
using namespace std;
int main()
{
void a; //会提示错误 “不允许使用不完整的类型”
return 0;
}
void*表示无类型指针
如果让我描述void*那么可以这样理解,既然是无类型指针那么我们也可以认为任意类型指针,说它是什么类型就是什么类型。为什么这么理解,首先不论是char*,int*,float*等,它们都指向的是一块内存,void*可以指向它们所指向的内存。例如:
//此程序并无实际意义只是做演示用
#include<iostream>
using namespace std;
int main()
{
void* temp; //任意指针类型
int* p_a = new int; //int* 类型
char* p_str = "hello"; //char* 类型
*p_a = 10;
temp = p_a; //viod* 类型指向 int* 类型
cout << *(int*)temp << endl; temp = p_str; //void* 类型指向 char* 类型
cout << (char*)temp << endl; delete p_a;
return 0;
}
//打印结果为
//10
//hello
//请按任意键继续. . .
注意:上述例子中存在类型转换的问题,首先void*指针类型指向其他指针类型时不需要强制转换,但是void*转其他指针类型时需要强制转换,如下:
//从上例中摘取的代码
void* temp; //任意指针类型
int* p_a = new int; //int* 类型
*p_a = 10;
temp = p_a; //viod* 类型指向 int* 类型 不需要强制转换
cout << *(int*)temp << endl;//需要用(int*)将temp的viod*转换为int*
看一下Linux.11内核源码中在string.h中的应用:
void * memcpy(void * dest,const void * src, int n)
void * memmove(void * dest,const void * src, int n)
/*在实际应用中也许我们能看见使用这两个函数时,第一个个参数不给char*类型时不会报错,是因为在实际源码中他们时"void*"类型的*/
再次认识void的更多相关文章
- java.utils.HashMap数据结构分析(转)
上图为Hashmap的数据结构图,具体实线是采用数组结合链表实现,链表是为了解决在hash过程中因hash值一样导致的碰撞问题. 所以在使用自定义对象做key的时候,一定要去实现hashcode方 ...
- IOS 学习笔记(2) 视图UINavigationController
1.栈 导航控制器自身有一个针对显示内容的栈,也有一个对于导航栏的栈,当有新的内容欲显示时,进的导航栏和显示内容会被压入此栈,这样原本显示中的导航栏和显示内容则会进入到栈的更深一层中,根据栈的先进后出 ...
- HashMap源码分析(一)
前言:相信不管在生产过程中还是面试过程中,HashMap出现的几率都非常的大,因此有必要对其源码进行分析,但要注意的是jdk1.8对HashMap进行了大量的优化,因此笔者会根据不同版本对HashMa ...
- cocos2d-x-3.1 win32程序-初识源代码(coco2d-x 学习笔记二)
本人吊丝一枚.没钱买mac电脑,仅仅能使用Visual Studio2013来开发cocos2d-x项目.当然也能够用eclipse来开发,可是开发与配置步骤要复杂的多,而且非常多功能没有其好.也是官 ...
- nordic mesh 任务调度实现
nordic mesh 任务调度实现 nordic mesh的任务调度室基于定时器实现的,有两个链表结构维护任务. 需要注意的是,任务调度的部分接口只能在"bearer event" ...
- OopenCV复习及函数深入理解(轮廓查询及绘图)
核心函数:(后面标明号的,下面有解析) int cvFindContours(Iplimage* img,//这是输入函数,必须是8bit,单通道的图像---1 CvMemStorage* stora ...
- iOS开发——生命周期
为了处理好应用程序的挂起.暂停等情况下的数据保存,或对应添加所需处理,我们必须了解ios生命周期. 但是不要去背去记,做个实验就好. - (BOOL)application:(UIApplicatio ...
- 使用iOS原生sqlite3框架对sqlite数据库进行操作
摘要: iOS中sqlite3框架可以很好的对sqlite数据库进行支持,通过面向对象的封装,可以更易于开发者使用. 使用iOS原生sqlite3框架对sqlite数据库进行操作 一.引言 sqlit ...
- Dart语言学习(十三) Dart Mixins 实现多继承
Mixins Mixins(混入功能)相当于多继承,也就是说可以继承多个类,使用with关键字来实现Mixins的功能. 那么多个类中有相同的方法时候,会被覆盖吗?覆盖的先后是什么? class A{ ...
随机推荐
- amd显卡更新最新驱动鼠标顿卡的解决方法
测试了下游戏,很稳.方法:在卡顿的状态下打开RADEON设置,依次点击显示器→规格→覆盖,将支持HDCP选为禁用,按提示重启即可.
- InetSim配置使用
参考网址: http://techanarchy.net/2013/08/installing-and-configuring-inetsim/ https://blog.csdn.net/isins ...
- S2-052 RCE漏洞 初步分析
PS:初步分析,只是分析了Struts2 REST插件的部分,本来菜的抠脚不敢发,但看到各大中心发的也没比我高到哪里去,索性发出来做个记事! 漏洞描述 2017年9月5日,Apache Struts发 ...
- factory di
services.AddScoped(typeof(Test)); //services.AddScoped<Test>() // .AddScoped<ITest, Test> ...
- Java笔记Spring(九)
完整调试springmvc源码 WebApplicationContext = new XmlWebApplicationContext();// XmlWebApplicationContext通过 ...
- ubuntu开机自动启动服务
编辑rc.loacl脚本 Ubuntu开机之后会执行/etc/rc.local文件中的脚本,所以我们可以直接在/etc/rc.local中添加启动脚本.当然要添加到语句:exit 0 前面才行.如: ...
- Pandas中Loc用法总结
摘自:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.loc.html 具体用法,假设数据源为: > ...
- Vue ElementUI 的使用
简介: 饿了么公司基于vue开的的vue的Ui组件库 1.Element Ui 基于vue pc端的UI框架 2. MintUi 基于vue 移 ...
- 用SVG做background image
1 用utf8格式, 需要 双引号“”替换为单引号,而且采用url encode编码,例如# 替换为 %23, body { background-image: url("data:imag ...
- redmine2.5升级到3.4
第一.安装需要升级的版本 参考文档:https://www.cnblogs.com/panwenbin-logs/p/10174525.html 二.备份源数据 [root@localhost ~]# ...