多级指针
二级指针 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]先和*结合——它是指针。