很多时候,我们无法确定数据类型,不管是传入的参数还是返回值。 比如 java 里面 api 返回体中的数据,经常会用泛型,因为每个api返回的数据实体都不一样,无法确定。 C 语言里面也有类似的情况,所有会有泛型指针,来切换指针的类型。比如我们在堆内存上申请空间的时候,使用`malloc` ```c void * malloc(size_t size); ``` 因为我们不知道这个内存申请完了以后用来存放什么,所以返回的是泛型指针。也就可以存放任何类型行的数据了。 # 实例 ```c #include <stdio.h> int main(int argc, char const *argv[]) { void *p; int a = 1; p = &a; // 把变量a的地址存放到p中 printf("a: %d\n",*(int *)p); // 如果要打印出a的值,那么就需要把p指针首选转换 int 类型的指针,然后通过 * 来解引,获取真实的值 return 0; } ``` 增加字符串 ```c #include <stdio.h> int main(int argc, char const *argv[]) { void *p; int a = 1; p = &a; // 把变量a的地址存放到p中 printf("a: %d\n",*(int *)p); // 如果要打印出a的值,那么就需要把p指针首选转换 int 类型的指针,然后通过 * 来解引,获取真实的值 char *c = "1111"; p = c; printf("c: %s\n", p); // 不会报错 printf("c: %s\n", (char *)p); // 这样更加易读 return 0; } ``` 为什么不是 ```c printf("c: %s\n", *(char *)p); ``` 因为`printf`的`%s`参数就是`char *`指针。