zoukankan      html  css  js  c++  java
  • 再次认识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*"类型的*/
  • 相关阅读:
    20165105 学习基础和C语言基础调查
    2017-2018网络攻防第四周作业
    2017-2018-2 20165233 实验三 敏捷开发与XP实践
    20165233 2017-2018-2 《Java程序设计》第九周学习总结
    Linux学习笔记(一)
    第三周学习总结
    数据结构C++,线性表学习
    uname()系统调用学习
    cd
    go连接数据库并执行文件中的sql语句
  • 原文地址:https://www.cnblogs.com/XLX-0327/p/10770968.html
Copyright © 2011-2022 走看看