C 指针的指针
1. 基本概念
指向指针的指针是一种多级的间接寻址,相当于一个指针链。通常一个指针存放一个变量的地址。
当定义一个指向指针的指针时,第一个指针存放了第二个指针的地址,第二个指针指向存放实际值的地址。
声明指向指针的指针变量
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. 指向指针的指针理解框图
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