重新认识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的更多相关文章

  1. java.utils.HashMap数据结构分析(转)

      上图为Hashmap的数据结构图,具体实线是采用数组结合链表实现,链表是为了解决在hash过程中因hash值一样导致的碰撞问题. 所以在使用自定义对象做key的时候,一定要去实现hashcode方 ...

  2. IOS 学习笔记(2) 视图UINavigationController

    1.栈 导航控制器自身有一个针对显示内容的栈,也有一个对于导航栏的栈,当有新的内容欲显示时,进的导航栏和显示内容会被压入此栈,这样原本显示中的导航栏和显示内容则会进入到栈的更深一层中,根据栈的先进后出 ...

  3. HashMap源码分析(一)

    前言:相信不管在生产过程中还是面试过程中,HashMap出现的几率都非常的大,因此有必要对其源码进行分析,但要注意的是jdk1.8对HashMap进行了大量的优化,因此笔者会根据不同版本对HashMa ...

  4. cocos2d-x-3.1 win32程序-初识源代码(coco2d-x 学习笔记二)

    本人吊丝一枚.没钱买mac电脑,仅仅能使用Visual Studio2013来开发cocos2d-x项目.当然也能够用eclipse来开发,可是开发与配置步骤要复杂的多,而且非常多功能没有其好.也是官 ...

  5. nordic mesh 任务调度实现

    nordic mesh 任务调度实现 nordic mesh的任务调度室基于定时器实现的,有两个链表结构维护任务. 需要注意的是,任务调度的部分接口只能在"bearer event" ...

  6. OopenCV复习及函数深入理解(轮廓查询及绘图)

    核心函数:(后面标明号的,下面有解析) int cvFindContours(Iplimage* img,//这是输入函数,必须是8bit,单通道的图像---1 CvMemStorage* stora ...

  7. iOS开发——生命周期

    为了处理好应用程序的挂起.暂停等情况下的数据保存,或对应添加所需处理,我们必须了解ios生命周期. 但是不要去背去记,做个实验就好. - (BOOL)application:(UIApplicatio ...

  8. 使用iOS原生sqlite3框架对sqlite数据库进行操作

    摘要: iOS中sqlite3框架可以很好的对sqlite数据库进行支持,通过面向对象的封装,可以更易于开发者使用. 使用iOS原生sqlite3框架对sqlite数据库进行操作 一.引言 sqlit ...

  9. Dart语言学习(十三) Dart Mixins 实现多继承

    Mixins Mixins(混入功能)相当于多继承,也就是说可以继承多个类,使用with关键字来实现Mixins的功能. 那么多个类中有相同的方法时候,会被覆盖吗?覆盖的先后是什么? class A{ ...

随机推荐

  1. java 通过jmx获取active mq队列消息

    一.修改active mq配置文件 修改\conf\activemq.xml,带下划线部分 <!-- Licensed to the Apache Software Foundation (AS ...

  2. python,字符串方法

    1.capitalize() 首字母大写 text = "hello word" text2 = text.capitalize() print(text2) 2.1.casefo ...

  3. (整理)REHL6.5_安装本地yum

    1.检查是否安装yum包 查看RHEL是否安装了yum,若是安装了,那么又有哪些yum包:rpm -qa |grep yum 2 删除redhat自带的yum包 rpm -qa|grep yum|xa ...

  4. IntelliJ IDEA 破解Jrebel6.3.0安装

    首先下载所必要的两个文件(jrebel3.6.0和cracked文件) 密码:pvsd 注意:如果不是该版本的Jrebel该破解文件可能无效. 步骤1:安装 解压文件得出两个压缩包 在idea中选择 ...

  5. Oracle所有分析函数<转>

    Oracle分析函数——函数列表 SUM        :该函数计算组中表达式的累积和 MIN        :在一个组中的数据窗口中查找表达式的最小值 MAX        :在一个组中的数据窗口中 ...

  6. python正则表达式写[强口令检测]

    关于正则表达式,如果想跟深入学习,建议您看一下<python 核心编程>(第三版)这本书,第一章的内容就是正则表达式. 关于我的学习,我在看<python编程快速上手>这本书第 ...

  7. azkaban使用--schedule定时任务

    1.schedule azkaban的schedule内部就是集成的quartz,而 quartz语法就是沿用linux crontab,crontab可照本文第2点 此处以此project(azka ...

  8. hbase版本升级的api对比

    前言 今天来介绍一下,hbase的2.1.0版本升级之后和1.2.6版本的api方法的一些不同之处. hbase的工具类 在介绍hbase的相关的java api之前,这里先介绍一下hbase的工具类 ...

  9. Spring-boot中@ConfigurationProperties,@Value,@PropertySource

    1.利用@ConfigurationProperties获取配置的值,@ConfigurationProperties是springboot提供的基于安全类型的配置放置. application.pr ...

  10. Linux网络编程学习(七) ----- 有名管道(第四章)

    1.什么是有名管道?为什么有了管道还需要有名管道? 有名管道是解决管道不能提供非父子进程间通信的缺陷.管道在Linux系统内部是以文件节点(inode)的形式存在,但由于其对外的不可见性(“无名”性) ...