多级指针(pointer to pointer to)是指向指针的指针,二级指针是指向一级指针的指针。
一级指针指向的是某个变量,也就是一级指针中存储的是某个变量的内存地址;二级指针指向一级指针,也就是二级指针中存储的是一级指针的内存地址。
int main(void)
{
int a = 10; //声明一个变量a
int *p = &a; //声明指针p,指向变量a
int **q = &p; //声明二级指针q,指向一级指针p
printf("a = %d\n",a); //打印变量a的值
printf("a的地址&a=%p\n",&a); //打印变量a的地址
printf("p = %p\n",p); //打印p的值
printf("p的地址&p=%p\n",&p); //打印p的地址
printf("p的解引用*p=%d\n",*p); //打印p的解引用
printf("q = %p\n",q); //打印q的值
printf("q的地址&q=%p\n",&q); //打印q的地址
printf("q的解引用*q=%p\n",*q); //打印q的解引用
printf("q的双重解引用**q=%d\n",**q); //打印q的双重解引用
return 0;
}
执行结果:
a = 10
a的地址&a=0x7fff5fbff838
p = 0x7fff5fbff838
p的地址&p=0x7fff5fbff830
p的解引用*p=10
q = 0x7fff5fbff830
q的地址&q=0x7fff5fbff828
q的解引用*q=0x7fff5fbff838
q的双重解引用**q=10
内存结构示意图:
如上图的代码和执行后的结果,从结果中就可以看出变量a,一级指针p和二级指针q的关系。
在学习的过程中主要是对二级指针不是很理解,所以这里特别对二级指针说明一下。
变量q是一个二级指针,里面存放的是一级指针p的地址,对q的解引用就得到了q所指向的一级指针的值,也就是变量a的地址,对q双重解引用就得到了变量a的值,所以也可以通过二级指针来修改变量a的值。