首先要理解指针 *p在左右不同的区别和如何定义指针类型:
例如:
int a;//假设a的地址为0xffff
a=10;
int *p=&a;
这里在左边的*p表示指针,记录的是数据a的地址。例如0xffff。
int a = 10;
int b = 20;
int *p = &a;
*p = 30;
b = *p;
这时候 p 指向了合法的地址 &a; *p = 30 就可以改变 a 的存储单元的值了,b = *p 是把 p指向内存单元(&a)现在的值(30)取出来给 b
总结上面:等号左边表示 要修改指针指向内存单元的值;等号右边表示 取出指针所指向内存单元的值
int c;
int*p=c;
char d;
char *p=d;
当定义指针时,定义的指针类型应当于被指向数据类型保持一致。如果被指向类型为int类型,那么定义的指针应当为int类型,如果被定义类型为char类型,那么定义的指针应当为char类型。
那么接下来就比较好理解了
int a=10; //a的地址是0xffff
int *p=&a;//*p的地址是0xfff9
int**p1=&p;
int**p2=*p;
这里 * p 在左边,即表示指针,记录的是a的地址0xffff,同时*p本身也有自己的地址0xfff9,此时我们int**p1可以理解为int * 和 *p1 前面的 *表示为指针,指向类型为 *p类型,所以 **p内容为 *p的地址0xfff9。
**p2指向 *p的内容,所以 **p2内容是 *p指向内容里保存的内容,即a的数值10;
同理 ***p是指向 **p的一个指针,其余以此类推。