Skip to content

LV050-多级指针

一、什么是多级指针?

1. 简介

  • 把一个 指向指针变量指针变量,称为多级指针变量。

  • 对于 指向处理数据指针变量 称为一级指针变量,简称一级指针。

  • 指向一级指针变量指针变量 称为二级指针变量,简称二级指针。

2. 二(多)级指针的声明

2.1 基本格式

c
<存储类型> <数据类型> ** <指针名>; /* 几级指针就写几个* 号*/

(1)指针变量也是一种变量,也会占用存储空间,也可以使用 & 获取它的地址。

(2) C 语言 不限制指针的级数,每增加一级指针,在定义指针变量时就得增加一个星号 *。实际开发中会经常使用一级指针和二级指针,几乎用不到高级指针。

2.2 示例

例如:

c
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. 怎么引用

c
** <指针名>; /* 几级指针就写几个* 号*/

通过上一节的多级指针初始化的分析可知,多级指针存放的都是地址,而 * 号可以取出地址中的数据,详细的使用情况可看下一节多级指针的存储空间的介绍。

二、多级指针的存储空间

我们写一个实例,来打印出对应的地址和内容:

c
#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;
}

image-20260227100810918

由上图打印信息分析可得各级指针在内存中情况如下:

image-20260227105917522

【注意】

(1)因为二级、三级和四级指针中存储的都是指针变量,而在 64 位系统中指针变量所占空间为 8 个字节,所以就出现了上边的情况。

(2) * 号是自右向左结合,所以引用多级指针的时候的时候可以这样理解:

md
****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 个字节。