在c和c++中如果我们想使用指针指向或者使用指针变量存放另外一个指针的地址,最容易想到的是再定义一个指针来存放:
? ? ? ? ?例:? ?int a = 10;? int * p = &a;?
? ? ? ? ? ? ? ? ? ?int *p1 = &p;? // 这种定义方法理论上是可行的,但是c和c++中是不允许的,存放指针变量
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??的地址必须使用二级指针。?
? ? ? ? ? ? ? ? ? ?int **p1 = &p; // 这种定义是正确的。?
有时候会有一下代码:??
int a = 10;? int *p = &a; int **p1 = &p;?
以上代码,a中存放10,p中存放10的地址,p1存放p的地址(p中放着10的地址)
int *p3 = *p1;?
以上代码的含义: 定义一个一级指针(存放一个数据的地址)p3,? 我们使用*p1获取p1指向地址所存放的值(即p中存放的值),p中存放的是一个数据的地址,并不是指针的地址,所以可以赋值给一级指针。?
1. int **p = &a;? ?int *tmp = *p;? *tmp;? ?
2. *(*p)? ,**p 都可以,同级运算符从右向左结合。