重新认识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文件File类学习总结

    java.io.File类 代表文件和目录,在开发中,读取文件.生成文件.删除文件.修改文件的属性都会用到该类. 常见构造方法: public File(String pathName){} 以pat ...

  2. Python【每日一问】07

    问:请解释使用 *args 和 **kwargs 的含义 答: *args:可变参数,表示将实参中按照位置传值,多余的值都给 args,多余的实参被打包成 tuple(元组),然后传递给函数调用 # ...

  3. webview之学习文章(待续)

    webview与js交互: Tencent/VasSonic(缓存优化方案) lzyzsd/JsBridge: pengwei1024/JsBridge: -----webview的框架 TheFin ...

  4. WebBrowser2控件使用

    一 简介 这是一个IE实现的com接口, 简单的浏览一个网页可以用这个东西, 局限性是IE现在有好多版本, 不同版本对标准的支持是不一样的, 而且将来不排除windows把IE给干掉了 二 使用 1 ...

  5. android 中activity重启的方法

    private void reLoadActivity(){ Intent intent = new Intent(context, SettingsActivity.class); intent.s ...

  6. 主动收入VS被动收入

    主动收入VS被动收入 天差地別 主动收入是指有工作才有收入, 不工作就没有的收入, 它是一种临时性收入, 做一次工作得到一次回报. 主动收入的最大的特点是 “用时间换钱”, 就像很多上班族有一份月薪6 ...

  7. redis 安装与使用

    到git 官网上下载redis: DownLoad,选择.zip 压缩包 2. 下载后,对zip 包进行解压,解压后如下: 3. 配置并安装redis, 打开window dos 窗口,将目录切换到解 ...

  8. C++实现串口的自动识别

    1.首先需要遍历注册表得到所有可用的串口 将得到的每一个串口保存到向量vector中,代码如下: // 得到所有的串口号 vector<string> cnComm::getComPort ...

  9. if判断,switch语句

    if ; else if; else; 判断操作: 格式示例: public class scanner { public static void main(String[] args){ int a ...

  10. js验证对象类型

    js验证对象类型 1. Object.prototype.toString.call() 这是最佳解决方案,可以用作通用方式处理.各种类型的判断依据类似于[object Object],替换的是后边的 ...