void

来源:互联网 发布:数据挖掘和搜索 编辑:程序博客网 时间:2024/05/17 23:02

void *p


  • void * p 空指针类型变量
    • p空指针类型变量,是一个指针,占4字节(32位系统)
    • 平时我们使用的指针,包含了两个信息
      • 信息一:是地址
      • 信息二:就是这个地址是几个字节连续的(例如:int 4)
      • char *p;//位置,原子(char)字节大小1
      • char **p;//位置,原子(指针)字节大小4
    • p空指针类型变量,的反面是一个地址,仅仅是一个地址而已,没有第二种信息
    • 所以如果指针变量不指定一个确定的数据类型,编译器不知道要读取几个字节的数据,它就无法正确访问地址里的数据,非法。
    • void *p的作用就是临时过度保存一下地址,前后需要转化。
int num = 10;void *p = &num;//剥去信息二cout << *p << endl;//非法,p不能指向确定类型的变量int *pp = (int *)p;//重新加入信息二

void

  • 不能定义void变量
    CPU能够寻找2的32次方的地址空间,而一个字节只有8位,那么4个字节刚好能够把CPU所有的寻址空间都能够表述出来,因此所有的指针都是4个字节。那么为什么我们平时还在定义不同数据类型的指针呢,可以直接定义一个数据指针就解决了我所有问题啊!你很聪明,不过设计C++语言的人比我们更聪明,如果我们都用一种数据类型来表示我们的地址,那么当一个int类型的变量的第一个字节的地址被保存到指针变量中的时候和一个char类型的变量的地址被保存到指针变量中的时候我们怎么知道是char类型的地址还是int类型的地址呢,因此指针变量包含了一个信息就是这个变量描述的地址应该是几个字节连续的,比如说我们定义了一个int类型的指针,那么指针变量知道这个地址是后面三个字节都是连续的,因此不能分开,是一个整体。好了现在问题有出现了,如果说我有一种数据类型,不知道它占有多少内存空间,但是我希望能够通过指针来操作它,怎么办,void指针出现了,void指针就是描述的不知道这个地址后面应该有多少字节进行连续,因此我们可以定义void指针。

    Void指针的用处都是在传递参数的时候,比如我定义了一个线程,但是我需要跟线程传递参数,但是在不同的情况下,线程的参数肯定不一样,那怎么办呢,好,我定义一个结构体或者类,把所有的参数都封装到结构体里面,然后定义一个结构体对象或者类对象,然后把结构体对象或者类对象的地址通过转化传递个线程处理函数,到线程处理函数里面在把指针变量进行转化回来,这样就解决了问题,这样还可以在参数里面进行线程返回信息,比如我有一个线程是计算,那么通过这样的方法就可以把计算的结果传递到线程处理函数的外面,这个可以算是c++比java优秀的地方,java里面只有通过全局变量或者成员变量,而C++可以直接通过指针就解决了问题。当然这个也是c++比java难的地方。

    总之,void是未知的,因此不能定义void变量,void指针是说不知道这个地址后面多少是连续的,但是指针本身的大小是4个字节,因此可以定义void指针。