很多時候,我們無法確定數據類型,不管是傳入的參數還是返回值。
比如 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 *`指針。