void* 类型指针
我们可以使用void*来定义个void
*类型的指针如下:
void *p;
p是void
*类型指针,其他类型指针隐式转换成该类型,不能直接使用*p来取值,必须先转换为特定类型再做取值
p可以接受任何类型的指针赋值
p赋值给其它类型的指针,需要强转
p不能进行解引用*运算,必须先转换
比如:
int i = 10;
char ch = ‘a’;
int *p1 = &i;
char *p2 = &ch;
void *pv1 = p1;//把p1赋值给pv1,不需强转,不能使用*pv1
void *pv2 = p2;//把p2赋值给pv2,不需强转,不能使用*pv2
int *p3 = (int *)pv1;//把pv1赋值给p3,需要强转
char *p4 = (char *)pv2;//把pv2赋值给p4,需要强转
也就是说:void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值。例如:
int * pint;
void *pvoid;
pvoid = pint; /* 不过不能 pint= pvoid; */
如果要将pvoid赋给其他类型指针,则需要强制类型转换如:pint= (int *)pvoid;
在ANSIC标准中,不允许对void指针进行算术运算如pvoid++或pvoid+=1等,而在GNU中则允许,因为在缺省情况下,GNU认为void
*与char
*一样。sizeof(*pvoid
)== sizeof( char)。
如果函数的参数可以是任意类型指针,那么应声明其参数为void*。
void *memcpy(void *dst, void *src, size_t len)