【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 抽象业务逻辑函数 )

2023-03-29 21:34:39 浏览数 (1)

文章目录

  • 一、二级指针排序 ( 抽象业务逻辑函数 )
    • 1、生成 二级指针 函数
    • 2、打印 二维指针 函数
    • 3、二维指针排序 函数
    • 4、释放 二维指针 函数
  • 二、完整代码示例

一、二级指针排序 ( 抽象业务逻辑函数 )


1、生成 二级指针 函数

首先 , 为 一维指针变量 分配内存 ; 在堆内存中 , 分配一块内存空间 , 用于存储 num 个 一维指针 , 每个 一维指针 指向一块内存空间 ;

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

然后 , 为每个 一维指针 在堆内存中 分配 20 字节内存 , 并为其赋值 ;

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

代码示例 :

代码语言:javascript复制
/**
 * @brief 生成二维指针
 * @param num
 * @return
 */
char **generate_memory(int num)
{
    // 循环控制变量
    int i = 0;

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

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

    if(p == NULL)
    {
        return NULL;
    }

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

2、打印 二维指针 函数

循环遍历 二维指针 指向的 一维指针 变量 , 打印字 二维指针 指向的 num 个 一维数组 指向的 字符串 ;

代码示例 :

代码语言:javascript复制
/**
 * @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("%sn", array[i]);
    }
}

3、二维指针排序 函数

排序时 , 交换 二维指针 指向的 一维指针 变量 ; 从大到小 进行排序 ;

代码示例 :

代码语言:javascript复制
/**
 * @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;
}

4、释放 二维指针 函数

先释放 二维指针 指向的 num 个 一维指针 指向的 内存空间 , 然后释放 二维指针 指向的内存空间 ;

注意 : 上述顺序不要反了 , 否则就出错了 ;

代码示例 :

代码语言:javascript复制
/**
 * @brief 释放二维指针内存
 * @param p
 * @param num
 */
void free_mem(char **p, int num){
    // 循环控制变量
    int i = 0;

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

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

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

二、完整代码示例


完整代码示例 :

代码语言:javascript复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/**
 * @brief 生成二维指针
 * @param num
 * @return
 */
char **generate_memory(int num)
{
    // 循环控制变量
    int i = 0;

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

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

    if(p == NULL)
    {
        return NULL;
    }

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

/**
 * @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("%sn", 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 **p, int num){
    // 循环控制变量
    int i = 0;

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

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

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


/**
 * @brief 主函数入口
 * @return
 */
int main()
{
    // 二维指针 指向的 一维指针 个数
    int num = 4;

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

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

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

    // 在堆内存中 , 分配一块内存空间
    // 用于存储 num 个 一维指针
    // 每个 一维指针 指向一块内存空间
    p = generate_memory(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;
}

执行结果 :

0 人点赞