C 语言多级指针 ( 在函数中生成 二级指针 | 通过传入的 三级指针 进行间接赋值 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 语言多级指针 ( 在函数中生成 二级指针 | 通过传入的 三级指针 进行间接赋值 )相关的知识,希望对你有一定的参考价值。

前言

如果要 通过 函数形参 间接赋值 修改 n n n 级指针, 需要向函数中传入 n + 1 n + 1 n+1 级指针 形参 ;





一、在函数中生成 二级指针 ( 通过传入的 三级指针 进行间接赋值 )



通过 函数 形参变量 , 间接赋值 返回 生成的 二级指针 函数 ;

如果要生成一个 二级指针 , 必须传入 三级指针 , 才能修改 该 二级指针 ;


注意 : 传入的 三级指针 , 不要直接修改该值 , 先创建一个临时的 局部二级指针变量 , 将 二级指针 生成完毕后 , 最后再给 三级指针 指向的地址 进行赋值 ;


代码示例 :

/**
 * @brief 生成二维指针
 * @param num
 * @return
 */
int generate_memory(char ***p3, int num)

    // 循环控制变量
    int i = 0;

    // 声明二维指针
    char **p = NULL;

    // 在堆内存中 , 分配一块内存空间
    // 用于存储 num 个 一维指针
    // 每个 一维指针 指向一块内存空间
    p = (char **)malloc( sizeof(char*) * num );

    if(p == NULL)
    
        return -1;
    

    // 遍历 二维指针 指向的多个 一维指针
    // 并为每个 一维指针 在堆内存中 分配 20 字节内存
    for(i = 0; i < num; i++)
    
        // 为每个字符分配 20 字节空间
        p[i] = (char *)malloc(sizeof (char) * 20);
        // 向内存中写入 字符串 , 字符串内容是 i + 1
        // 注意是通过通配符拼装的字符串
        sprintf(p[i], "%d", i + 1);
    

    // 将 三维指针 指向 生成的 二维指针 地址
    *p3 = p;

    return 0;





二、完整代码示例



完整代码示例 :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/**
 * @brief 生成二维指针
 * @param num
 * @return
 */
int generate_memory(char ***p3, int num)

    // 循环控制变量
    int i = 0;

    // 声明二维指针
    char **p = NULL;

    // 在堆内存中 , 分配一块内存空间
    // 用于存储 num 个 一维指针
    // 每个 一维指针 指向一块内存空间
    p = (char **)malloc( sizeof(char*) * num );

    if(p == NULL)
    
        return -1;
    

    // 遍历 二维指针 指向的多个 一维指针
    // 并为每个 一维指针 在堆内存中 分配 20 字节内存
    for(i = 0; i < num; i++)
    
        // 为每个字符分配 20 字节空间
        p[i] = (char *)malloc(sizeof (char) * 20);
        // 向内存中写入 字符串 , 字符串内容是 i + 1
        // 注意是通过通配符拼装的字符串
        sprintf(p[i], "%d", i + 1);
    

    // 将 三维指针 指向 生成的 二维指针 地址
    *p3 = p;

    return 0;


/**
 * @brief 打印二维指针数据
 * @param array
 * @param num
 */
void printf_array(char **array, int num)

    // 循环控制变量
    int i = 0;

    // 判定指针合法性
    if(array == NULL)
    
        return;
    

    // 打印字 二维指针 指向的 num 个 一维数组 指向的 字符串
    for(i = 0; i < num; i++)
    
        printf("%s\\n", array[i]);
    


/**
 * @brief 二维指针排序
 * @param p
 * @param num
 * @return
 */
int sort_array(char **p, int num)

    // 循环控制变量
    int i = 0, j = 0;

    // 排序时 , 交换指针 , 该指针是存储 要 交换指针 的临时变量
    char *tmp = NULL;

    // 判定指针合法性
    if(p == NULL)
    
        return -1;
    

    // 对 二维指针 指向的数据进行排序
    for(i = 0; i < num; i++)
    
        for(j = i + 1; j < num; j++)
        
            // 交换 i , j 指针指向的内存数据
            // 从 大 到 小 进行排序
            if(strcmp(p[i], p[j]) < 0)
            
                tmp = p[i];
                p[i] = p[j];
                p[j] = tmp;
            
        
    

    return 0;


/**
 * @brief 释放二维指针内存
 * @param p
 * @param num
 */
void free_mem(char ***p3, int num)
    // 循环控制变量
    int i = 0;

    // 设置临时变量 , 接收 p3 指向的二维指针
    char **p = *p3;

    // 判定指针合法性
    if(p3 == NULL)
    
        return;
    

    // 释放内存
    // 先释放 num 个 一级指针
    for(i = 0; i < num; i++)
    
        if(p[i] != NULL)
        
            free(p[i]);
            p[i] = NULL;
        
    

    // 再释放 二级指针
    if(p != NULL)
    
        free(p);
    

    // 二维指针 置空
    *p3 = NULL;



/**
 * @brief 主函数入口
 * @return
 */
int main()

    // 二维指针 指向的 一维指针 个数
    int num = 4;

    // 声明二维指针
    char **p = NULL;

    // 循环控制变量
    int i = 0, j = 0;

    // 排序时 , 交换指针 , 该指针是存储 要 交换指针 的临时变量
    char *tmp = NULL;

    // 在堆内存中 , 分配一块内存空间
    // 用于存储 num 个 一维指针
    // 每个 一维指针 指向一块内存空间
    generate_memory(&p, num);

    // 打印字 二维指针 指向的 num 个 一维数组 指向的 字符串
    printf_array(p, num);

    // 对 二维指针 指向的数据进行排序
    sort_array(p, num);

    // 打印字 二维指针 指向的 num 个 一维数组 指向的 字符串
    printf("\\nSort : \\n");
    printf_array(p, num);

    // 释放内存
    free_mem(&p, num);

    // 命令行不要退出
    system("pause");
    return 0;

执行结果 :

以上是关于C 语言多级指针 ( 在函数中生成 二级指针 | 通过传入的 三级指针 进行间接赋值 )的主要内容,如果未能解决你的问题,请参考以下文章

零基础学C语言知识总结十:二级指针指针数组和指向函数的指针

C语言提高内容目录

C 真正理解二级指针

C基础指针的使用

李连杰的二级指针,二级指针的用途,多级指针的定义使用,数组与指针的区别,void 类型指针,引用

C基础指针的使用