一、通用类型指针?
1、强制转换类型。
int a = 100;
int *pa = &a;
char b = 'x';
char *pb = &b;
在这里,我们能不能将&b赋值给pa,把&a赋值给pb?
int *pa = &b;
char *pb = &a; -> 编译警告: warning: initialization from incompatible pointer type
//两边的类型不一致
int *pa = (int *)&b;
char *pb = (char *)&a; -> 编译通过。
强制转换类型:int *pa = (int *)&b; &b默认是char*类型的指针,(int*)就是将这个&b地址强制转换为int*类型的指针。
(&b这个地址是指向第一层楼的,但是现在是指向前4层楼)
本来&b指向一个char类型的数据,但是现在指向int类型的数据。
2、什么是通用类型的指针?
通用类型指针变量其实就是可以存放任何类型的指针变量,也就是说什么类型的指针都可以赋值给通用类型的指针。
int*pa -> 只能赋值一些int*类型的指针,否则就会报错。
char*pb -> 只能赋值一些char*类型的指针,否则就会报错。
通用类型指针类型: void*
通用类型指针变量: void*px -> 任何类型的指针(无论是char*,int*,float*,double*),都可以存放在void *px这个变量。
(只是用来装地址的变量,至于这个地址指向什么数据,它就不知道了)
3、通用类型指针有什么作用? -> 解析强制转换类型的意义。
1)任意特定类型指针都可以赋值给通用类型指针。
int a; ->变量a的地址是int*类型
char b; ->变量b的地址是char*类型
double c;->变量c的地址是double*类型
void *p = &a;
void *p = &b;
void *p = &c;
以上几句话含义是什么意思?
仅仅是把a变量的地址,b变量的地址,c变量的地址的那个地址值赋值了p,一旦赋值了给p之后,这个地址指向的内容就变成了未知。
2)通用类型指针变量赋值给一写特定类型的指针变量?
int a = 100; //在内存中连续申请4个字节,然后使用变量a间接访问这片内存空间。
void *p = &a; //将a对应的这片空间的地址赋值給通用类型的指针p,这时候p确实可以保存a的地址,但是p指向的内容是未知的。
char *pa = p; //将a对应的这片空间的地址赋值給指针变量pa,这时候pa确保是保存着a的地址,而且非常明确地知道pa是指向一个字符类型的数据。
3)综上所述:
int a;
int *pa = &a; //pa是存放着a的地址,pa指向int类型的数据。
void *p = pa; //p是存放着a的地址,p指向未知的区域。
char *pb = p; //pb是存放着a的地址,pb指向char类型的数据。
等价于
int a;
char *pb = (char *)&a; ->强制类型转换就是使用void *去解析的。
4)易错点。
void a; -> 没有void型变量,只有void*变量。
void *p = &a;
int a = 100;
void *p = &a;
int b = *p; -> 编译出错:不能解引用void*指针。
结论: 如果你一定要解引用通用类型的指针,想得到这个指针指向的东西,那么就一定要先将通用类型指针强制转换为某种特定的指针。
正确:
int a = 100;
void *p = &a;
int b = *(int*)p;
二、指针运算。
1、指针的加减法。
int a = 100;
int *pa = &a; //pa就是存放着a的地址
pa+1 -> 将a的地址往上偏移1个单位</