跳转到内容

C 语言多级指针

来自代码酷

模板:Note

C语言多级指针[编辑 | 编辑源代码]

多级指针(Multi-level Pointers)是指向指针的指针,在C语言中常用于动态内存管理、多维数组处理及函数参数传递等场景。通过多级指针可以实现更灵活的数据结构操作。

基本概念[编辑 | 编辑源代码]

多级指针的本质是链式存储的地址。当指针变量存储另一个指针的地址时,形成多级指针关系:

graph LR A[二级指针] --> B[一级指针] --> C[实际变量]

数学表达为: 二级指针一级指针变量

声明语法[编辑 | 编辑源代码]

代码示例[编辑 | 编辑源代码]

二级指针基础[编辑 | 编辑源代码]

#include <stdio.h>

int main() {
    int num = 42;
    int *ptr1 = &num;    // 一级指针
    int **ptr2 = &ptr1;  // 二级指针

    printf("num的值: %d\n", num);
    printf("通过ptr1访问: %d\n", *ptr1);
    printf("通过ptr2访问: %d\n", **ptr2);

    return 0;
}

模板:Output

三级指针示例[编辑 | 编辑源代码]

#include <stdio.h>

int main() {
    float val = 3.14;
    float *p1 = &val;
    float **p2 = &p1;
    float ***p3 = &p2;

    printf("原始值: %.2f\n", val);
    printf("三级指针解引用: %.2f\n", ***p3);

    // 修改值
    ***p3 = 6.28;
    printf("修改后的值: %.2f\n", val);

    return 0;
}

模板:Output

内存模型分析[编辑 | 编辑源代码]

以下示例展示三级指针的内存关系:

graph TD A[val: 3.14] B[p1] --> A C[p2] --> B D[p3] --> C

对应的内存地址关系:

printf("val地址: %p\n", &val);
printf("p1存储的地址: %p\n", p1);
printf("p2存储的地址: %p\n", p2);
printf("p3存储的地址: %p\n", p3);

实际应用场景[编辑 | 编辑源代码]

动态二维数组[编辑 | 编辑源代码]

#include <stdlib.h>

int main() {
    int rows = 3, cols = 4;
    int **matrix = (int**)malloc(rows * sizeof(int*));
    
    for(int i = 0; i < rows; i++) {
        matrix[i] = (int*)malloc(cols * sizeof(int));
    }
    
    // 使用matrix[row][col]访问元素
    matrix[1][2] = 5;  // 第二行第三列赋值为5
    
    // 释放内存
    for(int i = 0; i < rows; i++) {
        free(matrix[i]);
    }
    free(matrix);
    
    return 0;
}

函数参数传递[编辑 | 编辑源代码]

当需要修改指针变量本身时:

void allocateMemory(int **ptr) {
    *ptr = (int*)malloc(sizeof(int));
    **ptr = 100;
}

int main() {
    int *p = NULL;
    allocateMemory(&p);  // 传递指针的地址
    printf("分配的值: %d\n", *p);
    free(p);
    return 0;
}

模板:Output

常见错误[编辑 | 编辑源代码]

页面模块:Message box/ambox.css没有内容。

进阶理解[编辑 | 编辑源代码]

多级指针的层级关系可以通过连续解引用验证: 三级指针:***ppp二级指针:**pp一级指针:*p

总结[编辑 | 编辑源代码]

多级指针特性总结
指针层级 声明示例 解引用方式 典型应用
int* p | *p | 单变量操作
int** pp | **pp | 动态数组/修改指针
int*** ppp | ***ppp | 复杂数据结构

模板:KeyPoint