多重指针指的是在一条语句中有2个或以上的*。
代码如下:
#include <stdio.h>
int main() {
int i[] = {10, 20, 30, 40, 50};
int *pa[] = {i, i+2, i+1, i+4, i+3};
int **p = pa;
printf("Initial **p = %d\n", **p);
p++;
printf("After p++, the **p = %d\n", **p);
++*p;
printf("After ++*p, the **p = %d\n", **p);
**p++;
printf("After **p++, the **p = %d\n", **p);
++**p;
printf("After ++**p, the **p = %d\n", **p);
return 0;
}
运行结果:
Initial **p = 10
After p++, the **p = 30
After ++*p, the **p = 40
After **p++, the **p = 20
After ++**p, the **p = 21
定义分析如下:
int i[] = {10, 20, 30, 40, 50};
定义一维数组。
int *pa[] = {i, i+2, i+1, i+4, i+3};
表示pa是一个数组指针,其中pa[0], pa[1]...分别执行i数组的某一个元素的地址。
int **p = pa;
表示p是一个指向指针的指针,初值为pa。
运行分析如下:
1. p++;
p往前一个元素。
2. ++*p;
++和*具有相同的运行优先级,结合性由右至左,等于: ++(*p)。因此,是*p所指地址加1。
3. **p++;
等于**(p++)。虽然p++先做,但是此处++为后继加,所以要先处理**,再执行加1。此语句最终将p的地址指向下一个。
4. ++**p;
等于++(**p)。即p指向的数值加1。
没有运行之前,对于第三步,弄错了。