美文网首页
2019-04-25 重新认识void

2019-04-25 重新认识void

作者: 知成 | 来源:发表于2019-06-16 18:15 被阅读0次

    重新认识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"类型的

    相关文章

      网友评论

          本文标题:2019-04-25 重新认识void

          本文链接:https://www.haomeiwen.com/subject/jzwgfctx.html