LV050-多级指针
一、什么是多级指针?
1. 简介
把一个 指向指针变量 的 指针变量,称为多级指针变量。
对于 指向处理数据 的 指针变量 称为一级指针变量,简称一级指针。
把 指向一级指针变量 的 指针变量 称为二级指针变量,简称二级指针。
2. 二(多)级指针的声明
2.1 基本格式
<存储类型> <数据类型> ** <指针名>; /* 几级指针就写几个* 号*/(1)指针变量也是一种变量,也会占用存储空间,也可以使用 & 获取它的地址。
(2) C 语言 不限制指针的级数,每增加一级指针,在定义指针变量时就得增加一个星号 *。实际开发中会经常使用一级指针和二级指针,几乎用不到高级指针。
2.2 示例
例如:
int a = 10; /* 定义了一个整型变量 a */
int *p1; /* 定义了一个一级整型指针变量 p1 */
int **p2; /* 定义了一个二级整型指针变量 p2 */
int ***p3; /* 定义了一个三级整型指针变量 p3 */
int ****p4; /* 定义了一个四级整型指针变量 p4 */3. 怎么初始化?
| 初始化写法 | 等价写法(赋值) |
| int a = 10; int *p1 = &a; int **p2 = &p1; int ***p3 = &p2; int **** p4 = &p3; | int a = 10; int *p1; int **p2; int ***p3; int **** p4; p1 = &a; p2 = &p1; p3 = &p2; p4 = &p3; |
【注意】指针变量的初始化或者赋值,后边一定要是 地址。
【说明】上边初始化的部分,定义了一个整型变量 a ,然后定义了一个一级指针变量 p1 ,指针变量 p1 中存放的数据是整型变量 a 的地址;又定义了一个二级指针变量 p2 , p2 中存放的是 p1 的地址;又定义了一个指针变量 p3 ,里边存放的是 p2 的地址;再后面又定义了一个四级指针变量 p4 ,里边存放的是 p3 的地址。具体的存储情况,后面再看。
4. 怎么引用
** <指针名>; /* 几级指针就写几个* 号*/通过上一节的多级指针初始化的分析可知,多级指针存放的都是地址,而 * 号可以取出地址中的数据,详细的使用情况可看下一节多级指针的存储空间的介绍。
二、多级指针的存储空间
我们写一个实例,来打印出对应的地址和内容:
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 10;
int *p1 = &a;
int **p2 = &p1;
int ***p3 = &p2;
int ****p4 = &p3;
printf("a=%d,&a=%p\n", a, &a);
printf("*p1=%d,p1=%p,&p1=%p\n", *p1, p1, &p1);
printf("**p2=%d,*p2=%p,p2=%p,&p2=%p\n", **p2, *p2, p2, &p2);
printf("***p3=%d,**p3=%p,*p3=%p,p3=%p,&p3=%p\n", ***p3, **p3, *p3, p3, &p3);
printf("****p4=%d,***p4=%p,**p4=%p,*p4=%p,p4=%p,&p4=%p\n", ****p4, ***p4, **p4, *p4, p4, &p4);
return 0;
}
由上图打印信息分析可得各级指针在内存中情况如下:

【注意】
(1)因为二级、三级和四级指针中存储的都是指针变量,而在 64 位系统中指针变量所占空间为 8 个字节,所以就出现了上边的情况。
(2) * 号是自右向左结合,所以引用多级指针的时候的时候可以这样理解:
****p4 = ***(*p4) = ***p3 = **(*p3) = **p2 = *(*p2) = *p1 = 10
***p3 = **(*p3) = **p2 = *(*p2) = *p1 = 10
**p2 = *(*p2) = *p1 = 10
*p1 = 10三、多级指针的运算
总的来说,多级指针也是指针,符合一级指针的运算规则。指针变量加 1,是向地址大的方向移动一个目标数据。类似,多级指针运算也是以其 目标变量 为单位进行偏移。
比如,int *p; p++,移动的是一个 int 类型变量所占的内存空间,对于二级指针 int **p; p++; 移动一个 int * 变量(这是一个指针变量)所占的内存空间。再比如 int ***p; p++ 移动一个 int **(这是一个指针变量)所占的内存空间。
其实多级指针中存放的都是指针变量,除了一级指针,多级指针移动时,移动的都是一个指针变量的大小,在 32 位系统中是 4 个字节,在 64 位系统中是 8 个字节。