指针的指针: 如果一个指针变量存放的是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。
假如定义了一个二级指针:
int **q;
对于上述例子的二级指针,我们可以把int **q
拆分成两部分看:,即int*
和 (*q)
,后面 (*q)
中的 *
表示 q 是一个指针变量,前面的int*
表示指针变量 q 只能存放int*
型变量的地址。同理不管多少级的指针变量,它都是一个指针变量,指针变量就是一个*
,其余的*
表示的是这个指针变量只能存放什么类型变量的地址。
下面来举一个例子。假如定义了一个指针变量 p 指向一个 int 型变量:
int i = 10;
int *p = &i;
int **q = &p;
int*p
表示 p
指向的是int
型变量,里面只能存放 int
型变量的地址。 p
是指针变量,它的地址也可以定义一个指针变量存放它:int **q = &p;
因为指针变量p
的基类型为 int 型,所以 &p
的基类型为 int*
型 。所以如果要定义一个能指向int*
型变量的指针变量,有两个要求:首先它要是指针变量,即一个*
;其次,该指针变量指向的是 int*
型的数据,或者说存放的是 int*
型变量的地址,所以就是 int**
。
两个*
表示二级指针,就是指针的指针。二级指针需要两个*
才能指向最终的内存单元,即**q==i
。变量 q
中存放变量p
的地址,又因为*q=p;
即,存放的也是*q
的地址,因为**q=*p=i
,即变量 *q
或变量p
中存放变量**q
的地址,变量**q
中存放i
的内容,即 10。或者说:q
指向 *q
,*q
指向**q
,**q
中存放i的内容,即 10。