Skip to main content

C 指针的指针

1. 基本概念

指向指针的指针是一种多级的间接寻址,相当于一个指针链。通常一个指针存放一个变量的地址。

当定义一个指向指针的指针时,第一个指针存放了第二个指针的地址,第二个指针指向存放实际值的地址。

ZYGM3v.png

声明指向指针的指针变量

int **p;       // 指向int型的指针 (int *)(*p)

2. 指向指针的指针

#include <stdio.h>

int main(int argc, char *argv[])
{
int var = 100;
int *ptr1 = &var;
int **ptr2 = &ptr1;

return 0;
}
  • ptr1 定义的就是指向整型的指针,存放的就是整型变量 var 的地址。
  • *ptr1 就是对指针进行解引用,访问整型变量 var 地址得到里面的值100。
  • ptr2 就是指向指针的指针,ptr2 存放的就是指针变量 ptr1 的地址。
  • 对 ptr2 进行一层解引用(*ptr2)访问指针变量 ptr1 的地址得到 ptr1 的值(也就是 var 的地址)。
  • 对 ptr2 进行两层解引用(**ptr2)相当于是对 ptr1进行一层解引用( *ptr1)得到 var 的值100。
  • 也就是通过间接访问 ptr1 的地址得到 ptr1存放的变量 var 的地址得到 var 的值。

3. 指向指针的指针理解框图

ZYG2ME.png

4. 实际测试代码

#include <stdio.h>

int main(int argc, char *argv[])
{
int var = 100;
int *ptr1 = &var;
int **ptr2 = &ptr1;

printf("var的值: %d\n", var);
printf("var的地址: %p\n", &var);
printf("*ptr1的值: %d\n", *ptr1);
printf("ptr1存放的val的地址:%p\n", ptr1);
printf("*ptr2访问的是ptr1存放的地址: %p\n", *ptr2);
printf("ptr2存放的是ptr1的地址: %p\n", ptr2);
printf("**ptr2访问的是ptr1存放的地址的值: %d\n", **ptr2);

return 0;
}

5. 运行结果

var的值: 100
var的地址: 0x7fffd5684cf4

*ptr1的值: 100
ptr1存放的val的地址: 0x7fffd5684cf4

*ptr2访问的是ptr1存放的地址: 0x7fffd5684cf4
ptr2存放的是ptr1的地址: 0x7fffd5684cf8
**ptr2访问的是ptr1存放的地址的值: 100