数组指针 指针数组 函数指针 指针函数 二级指针的应用场景

78 阅读2分钟

image.png

image.png

image.png

image.png

二级指针的应用场景

//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