美文网首页
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

    重新认识void 在初学c/c++时感觉void是一个很不起眼的关键字。因为在c++中我使用的还是比较少的。但是到...

  • void *(*)(void *)、void *(^)(void

  • day22

    2019-04-25

  • ❄️画檐蛛网惹飞絮

    2019-04-25

  • void和void*

    总结: void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。 1...

  • void和void *

    一、void void的意思是“无类型”,相对于void *来说,使用的时候比较简单,一般只在两个地方使用: 当函...

  • void 和 void *

    一...void的含义void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。(1)void指...

  • void 和 void*

    void指针是什么? void指针一般被称为通用指针或泛指针,它是C关于“纯粹地址(raw address)”的一...

  • 【每日经济学人】2019-04-25

    2019-04-25 In a Chinese border town, officials try a new ...

  • void 与void *(一)

    (一)Void的使用规则: 1.函数没有返回值,函数类型声明为void; 2.如果函数没有参...

网友评论

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

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