二级指针的应用场景
//1.动态二维数组的创建与释放
// 创建3x4的二维数组
int **matrix = (int**)malloc(3 * sizeof(int*));
for(int i = 0; i < 3; i++) {
matrix[i] = (int*)malloc(4 * sizeof(int));
}
// 使用示例
matrix[1][2] = 10; // 访问第二行第三列
// 释放内存
for(int i = 0; i < 3; i++) free(matrix[i]);
free(matrix);
//关键点:1. 外层指针数组存储每行的首地址 2. 每行可独立分配不同长度(不规则数组)
//2.在函数内修改外部指针
void allocate_memory(char **ptr, int size) {
*ptr = (char*)malloc(size); // 修改外部指针的值
}
int main() {
char *buffer = NULL;
allocate_memory(&buffer, 100); // 传递指针的地址
strcpy(buffer, "Hello");
free(buffer);
}
**典型场景**:
- 需要在函数内部分配内存并返回给调用者
- 需要重置外部指针(如 `realloc` 后)
3 字符串数组的动态处理
char **names = (char**)malloc(5 * sizeof(char*));
names[0] = strdup("Alice");
names[1] = strdup("Bob");
// ... 使用后需要逐个free names[i] 再 free(names)
**优势**:
- 支持动态增减字符串数量
- 各字符串长度可不同
4. **多级数据结构(如链表中的指针修改)**
// 在链表头部插入节点
void insert_node(Node **head_ref, int data) {
Node *new_node = (Node*)malloc(sizeof(Node));
new_node->data = data;
new_node->next = *head_ref;
*head_ref = new_node; // 修改外部头指针
}
5. **命令行参数处理**
int main(int argc, char **argv) {
while(*argv) {
printf("Arg: %s\n", *argv);
argv++;
}
}
**机制**:
- `argv` 是指向字符串指针数组的二级指针
- 通过指针移动遍历参数列表
6. **函数返回动态指针的指针**
int** create_matrix(int rows, int cols) {
int **mat = (int**)malloc(rows * sizeof(int*));
for(int i = 0; i < rows; i++)
mat[i] = (int*)malloc(cols * sizeof(int));
return mat;
}
二级指针的底层原理
int val = 10;
int *p = &val; // 一级指针存储变量的地址
int **pp = &p; // 二级指针存储指针的地址
**pp = 20; // 等价于 val = 20
*pp = NULL; // 将p置为NULL