void* 是一个特殊的指针,它的意义为无类型指针,他可以被赋值为任意类型的指针,但是仅限当作一个指针使用。
void* 是不能直接被 * 访问地址的内容,因为还不知道具体要读多少个字节;而且void* 不能参与指针运算,比如
void func(void* array){
printf("%d\n",array[0]);
}
这段代码通不过编译,会提示void类型不能被当作完整的类型来处理。因为array[i]的访问其实是 array+ i*sizeof(array),但是void类型属于无类型,它的sizeof的值应该是不能被编译器接受,所以编译器拿不到sizeof的值就访问不了。
【事实上输出void的sizeof()值为1】
所以void*的使用必须得先为他分配一个类型。
void* 作为变量使用:
int b;
void* num;
b=3;
num=&b;
printf("%d\n",*(int*)num);
在num=&b 这一步之后,num的值是等于b的地址了,但是num本身并没有被表明为 int* ,所以在后续的printf的访问中,还是需要强制转换才能访问。
在函数形参中的使用:
看一下memCpy的代码:
void *memCpy(void *dest, const void *src, size_t n)
{
if (NULL == dest || NULL == src || n < 0)
return NULL;
char *tempDest = (char *)dest;
char *tempSrc = (char *)src;
while (n-- > 0)
*tempDest++ = *tempSrc++;
return dest;
}
这里的的形参是void*, 传进来的是一个一维数组的起始地址。这里并没有直接使用 dest[i]这种方式访问内容,而是先将void* 强制转换为char* 并赋值给 tempDest 才开始正常的数组访问。所以这里的 void* 我觉得更像是一个指针容器,可以接受任何类型的指针,然后进入函数之后再将其转换为需要的特定的类型。