void *指针
1.无类型指针,指向一块实际存放数据的地址,但该地址存放的数据的类型不确定。可以指向任意类型的指针。
如动态内存分配
void * memset ( void * buffer, int c, size_t num );
void * memcpy(void *dest, const void *src, size_t len);
2.void类型指针指向的数据类型时不确定的,只是单纯的操作此内存块,并不关注该片内存是什么类型,所以在进行内存分配后,需要强制类型转换,在进行数据的存储
char*str=(char*)malloc(sizeof(char)*13);
3.void*赋值给其他指针时需要进行强制类型转换。但是任何数据类型的指针都可以直接赋值给void *。
void *arg;
int i;
i=(int *)arg;
void *p1;
int *p2;
p1 = p2;
4.void *指针不能进行算法操作,因为不清楚变量的类型,如:
void *p;
p++; //错误
p = p + 1; //错误
int *p;
p++; //正确
NULL指针
1.空指针实质上是有指向的指针,但它指向的地址是很小的地址,约定俗成为地址0。在c语言中NULL的定义为:#define NULL ((void *)0)
显而易见,NULL转换成void * 类型,本来void * 类型是用来存放地址的,那么这里的0自然就是地址0了。
在内存分配方面,较小的地址是不用来存放数据的,也不允许程序访问的。所以,指针指向了它,就是这个指针不能操作它指向的这块较小的地址。
2.空指针有指向,但是它指向的地址是特殊的,该地址不允许存放数据和不允许程序访问,所以空指针不能操作该地址里的东西。所以能够防止误用。