void指针
void指针一般被称为通用指针或泛指针。当某个指针式void型指针时,所指向的对象不属于任何类型。是C语言关于存粹地址的一种约定。
void指针不属于任何类型,因此不可以对其进行算数运算,如定义一个void *ptr,无法对其进行自增操作(ptr++),因为编译器不知道其需要增加多少,但我们知道char *型指针自增后,就是其地址加1。
在C/C++中,任意时刻都可以使用其他类型指针来代替void指针,或者用void指针来代替其他类型指针。
因此根据上述的特性,可以使用void指针实现一些有用的技巧,指针的本质,是指向某个地址。
void指针的使用
void *ptr = NULL;ptr将成为一个通用指针,任何数据类型(char,int等)的任何变量的地址都可以赋值给void指针变量。示例如下:
int a = 1;
char b = 'A';
void *ptr = NULL;
ptr = &a; //合法操作
ptr = &b; //合法操作
对指针变量的解引用,使用间隔运算符*达到目的。但是在使用空指针的情况下,需要转换指针以解引用。这是因为空指针没有与之关联的数据类型。编译器无法知道void指针指向的数据类型。因此,要获取由void指针指向的数据,需要使用在void指针为之内保存的正确类型的数据进行类型转换。
int a = 1;
void *ptr = NULL;
ptr = &a; //合法操作
*ptr = 10; //不合法操作
需要注意的是,不同的编译对void指针处理是不一样的,如上述写法在GNU中则可以编译,在IAR中无法编译通过。无论如何,都不要使用这种非常规的用法。正确用法如示例:
//void型指针解引用须做类型指定
*(int *)ptr = 10;
2020-10-18 李不清的烦恼。