在C++中 void*这个指针类型指什么。

不是太明白 请各位大神讲解一下。变量是没有void类型的 是指向函数指针的嘛????

C/C++所有的指针, void*, int*, char*, float*, strcut* , class*本质上是没有区别的,都占用一个int的空间,表示一个内存地址而已。
取地址所指向的数据时,才需要把指针分成不同的类型,目的是告知编译器取多少字节的数据,以及怎样结束取到的数据而已。例如:int*,只是指出这是一个int数据的起始地址,然后以此开始去4/8字节,将其中的数据解释个一个int值。

看以下用法:

 #include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    int i = 12345678;
    //void* points at int* 
    void *p = &i;
    printf("int to int: %d\n", *(int*)p);
    printf("int to char[0]: %c\n", *(char*)(p+0));
    printf("int to char[1]: %c\n", *(char*)(p+1));
    printf("int to char[2]: %c\n", *(char*)(p+2));
    printf("int to char[3]: %c\n", *(char*)(p+3));
    printf("int to float: %f\n", *(float*)p);

    return 0;
}

虽然原始数据是一个int,但是可以取其地址,将int中4个字节的数据当成其他类型来用:char, float。(利用char可以交换int的高低字节)
当然,随意乱用也是不行的,可以会发生访问越界错误:访问未分配的空间或访问系统保留空间。

void * 属于空指针,使用的时候可以强制转化为任意的指针类型。

 任意的指针类型。
“void * 属于空指针,使用的时候可以强制转化为任意的指针类型。”这种说法是不准确的。实际上void*出现的目的是语义上的需要,也就是我们不适合将它用任何具体类型表示的时候,我们定义成void*
从语言本身说,任何指针都可以强制转换为其它指针类型,而不仅是void *,同时,任何指针类型都可以表示空指针。而void *也可以表示非空指针。
void *更确切地说,是指类型不定,或者任意类型。
比如说 memcpy 这个函数,它的参数就是ivoid,因为它可以拷贝任意类型的内存。
再比如说 qsort的最后一个参数(int*)(void *,void *),这个函数指针的两个参数表示待比较的数,无法确定具体类型。

空指针不指向任何对象,在试图使用一个指针之前代码可以首先检查它是否为空。
生成空指针的方法:

 int *p1= nullptr; //c++11标准,等价于int *p1 = 0;
int *p2= 0; //直接将p2初始化为字面常量0
int *p3= NULL; //在stdlib库中,等价int *p3 =0;
//其中nullptr是一种特殊类型字面值,它可以被转换成任意其他指针类型。

类型相同的合法指针可以用操作符(==)和(!=)来比较,比较结果是布尔型。
当两个指针存放的地址相同时返回true,两个指针存放的地址值相同有三种可能:
1.两个指针都为空 2. 都指向同一个对象 3.都指向同一个对象的下一地址

空指针 可以存放任意对象的地址,但是我们队该地址中到底是个什么类型的对象并不了解。
空指针可以用来和别的指针比较,作为函数的输入或输出,赋给另外一个空指针。
空指针不能直接操作所指的对象,因为我们不知道这个对象是什么类型。

 double obj =3.14, obj2 =3.15, *pd = &obj ;
void *pv=&obj;
if(pv==pd)//比较结果为1
        cout<<1<<endl;
    else
        cout<<0<<endl;
cout<<*pv<<endl;//错误

void*指针,可以把任何类型的指针赋值给VOID*

void类型指针
关于void是啥类型,这个在我看来就是任意类型,或是不知道是啥类型的类型
因为有时候你不需要关注或是无法关注某些值的类型,你不能给这个值强加某个类型,这时候就用void类型。
在c、c++中类型标志着一段数据的存储大小和对应的处理数据的方式,void应该就是那种不指定长度(具体多长你随便)也不指定处理方式的类型,在对相应数据进行处理的时候必须要强转成其他能处理的类型(对这块空间制定元素长度和处理数据的方式)

void* :无类型指针,在底层处理等同于char*

在 VS 里 多数被 用作 Function Pointer。在指明 void* 要指的东西后,要转换到被指的东西的类型才可以用,不然的话会语法错误。

空指针(相当于万金油..没有固定类型)

void *p;
上句的语句定义了一个指针p,其类型为void *,这样的指针为void指针,可以用任何类型的指针对void指针进行赋值或初始化,例如:
double d=1.5;
void *p=&d;

void *p1;
p1=&d;
由于sizeof(void)是没有定义的,所以void *类型的指针p,表达式“*p”也没有定义,而且所有前面所述的各种指针运算对p也不能进行。
void指针主要用于内存赋值如:
void *memset(void *dest,int ch,int n);
将从dest开始的n个字节,都设置成ch,返回值是dest.

void*指针,可以把任何类型的指针赋值给VOID*

Notice:
char* buffer = (char*)malloc(100);

void* v_pointer = (char*)buffer; //right
char* c_pointer = (char*)v_pointer;
v_pointer = v_pointer + 10; //error
c_pointer = c_pointer + 10; //right

void *可以是任意类型的指针,在需要的时候再强制类型转换为具体的数据类型,一般这种技巧在C语言里面用的比较多

“通用”指针?在需要用的时候再指定类型

void *依然也是无类型的指针,但当要用的时候转换成对应类型的指针就可以

void *是可以是任意类型的指针,在使用的时候要指定一个具体的类型