Z
ZHANK

多级指针

二级指针 int**、指针数组 vs 数组指针、命令行参数

多级指针

指针也能指向指针——这就是多级指针。不是每天都写,但理解它是理解复杂数据结构的基石。

学完本章你将: 掌握二级指针 int**、指针数组 vs 数组指针、命令行参数接收。


二级指针是什么

c
#include <stdio.h>

int main() {
    int x = 42;
    int *p1 = &x;      // 一级指针:指向 x
    int **p2 = &p1;     // 二级指针:指向 p1

    printf("%d\n", x);     // 42
    printf("%d\n", *p1);   // 42(一级解引用)
    printf("%d\n", **p2);  // 42(二级解引用)

    return 0;
}
内存关系:p2 → p1 → x(42)
         地址A  地址B  42

二级指针的应用场景

c
// 1. 函数内修改指针本身(如动态分配、链表操作)
void allocate(int **pp) {
    *pp = malloc(sizeof(int) * 100);  // 给外面的指针赋新地址
}

// 2. 命令行参数
int main(int argc, char **argv) {
    // argv 就是 char**(字符串数组)
    for (int i = 0; i < argc; i++) {
        printf("argv[%d] = %s\n", i, argv[i]);
    }
}

指针数组 vs 数组指针

c
// 指针数组:数组里放指针
char *strs[] = {"red", "green", "blue"};  // 3 个 char* 的数组

// 数组指针:指向数组的指针
int mat[2][3];
int (*p)[3] = mat;  // p 指向一个 int[3] 的数组

// 记忆技巧:
// int *arr[5]   → arr 是数组,有 5 个元素,每个是 int*(指针数组)
// int (*arr)[5] → arr 是指针,指向一个 int[5](数组指针)

💡 区分技巧:优先级 [] > *,所以 *arr[5] 先和 [5] 结合——它是数组;(*arr)[5] 先和 * 结合——它是指针。