(1)没有类型的指针的格式
void* 变量名
特点:无法获取数据,无法计算,但是可以接收任意地址。
(2)不同类型指针之间不能互相赋值
int* p1 = &a
char* p3 = p1;
此时用char* p3 = p1; 运行程序会提醒:初始化从int* 到char* 的类型不兼容;
但是又能正常运行,是因为系统自动帮我们进行了强转:
char* p3 = (char*)p1;

所以按照逻辑来说,不同类型的指针之间,是不能互相赋值的,赋值的时候需要强转。
void类型指针因为没有任何类型,所以可以接受任意类型指针记录的内存地址

______________________________________________________________________________________我是分割线
(3)利用void类型指针来交换两个变量记录的值
定义一个无返回值类型的函数swap(),形参分别为void* p1,void* p2,int len。
这里的int len代表的是数据类型字节大小,例如int类型,这里的len就要传递4;
函数体如图:

①、把void类型转换为char类型的指针
char* pc1 =p1;
char* pc2 =p2;
这一步的主要目的是为了方便接下来的int类型的数据转换。
在之前的学习中,int类型内存地址在内存池中占4个字节,每一个字节都是单独的一个块,第一个块被称为首地址,首地址代表整个int类型的地址值,这4个字节一共分为32个bit位,如果想要把一整个int类型的数据进行互换,也就是要按照顺序把这4个字节里面的32个bit全部互换。

所以这里定义char类型的指针变量,是为了进行1个字节1个字节的互换。
②、定义循环,进行字节的替换。
以字节为单位,一个字节一个字节的替换

先要定义一个char类型的变量temp存储指针pc1替换之前的数据。
这里的 i 单纯只是循环的执行次数
由于替换的是int类型,所以i < len(4),循环每完成一次,i就+1
第一次循环从0开始,代表我从第一个字节开始互换,循环每完成一次,char类型指针pc1和pc2就向右移动1个字节,然后开始下一个字节的互换。
以此类推。
这里还涉及到了指定移动的步长,由于是char类型,所以char类型指针变量每+1,移动的步长为1字节。
使用void类型指针用来替换同类型的数据,好处就是这个函数可以根据不同的需求做不同类型的转换。
③、调用函数并打印输出

(4)void类型指针的缺点
无法获取变量里面的数据,也不能进行加、减的操作(因为加、减操作需要明确指针的类型)。
