我们知道,指针变量是复合型变量,其有两重含义,一个地址,二是类型。
比如
int i;
int *p = &i;
p存放的是变量i的地址,因为int型变量在32位系统中占4个字节,所以其实p中存储的是i的第一个字节的地址。但是解引用的时候,因为我们已知i占了4个字节,所以可以从第一个字节的地址挨个往后数,数够4个,正好可以把i取出来。因为不同类型的指针变量其对应类型不同,占用地址空间不同,因此一般不能相互赋值。
void * 指针只有一重含义,即地址,其没有类型的概念,因此void*只是记录了某个地址,我们可以把任意类型的指针赋值给void *类型,但是没办法用void*指针解引用,因为我们不知道void *指针具体指向的是哪一种类型,占多少字节。