文章目录
一、二级指针排序 ( 抽象业务逻辑函数 )
1、生成 二级指针 函数
2、打印 二维指针 函数
3、二维指针排序 函数
4、释放 二维指针 函数
二、完整代码示例
一、二级指针排序 ( 抽象业务逻辑函数 )
1、生成 二级指针 函数
首先 , 为 一维指针变量 分配内存 ; 在堆内存中 , 分配一块内存空间 , 用于存储 num 个 一维指针 , 每个 一维指针 指向一块内存空间 ;
// 在堆内存中 , 分配一块内存空间 // 用于存储 num 个 一维指针 // 每个 一维指针 指向一块内存空间 p = (char **)malloc( sizeof(char*) * num );
然后 , 为每个 一维指针 在堆内存中 分配 20 字节内存 , 并为其赋值 ;
// 遍历 二维指针 指向的多个 一维指针 // 并为每个 一维指针 在堆内存中 分配 20 字节内存 for(i = 0; i < num; i++) { // 为每个字符分配 20 字节空间 p[i] = (char *)malloc(sizeof (char) * 20); // 向内存中写入 字符串 , 字符串内容是 i + 1 // 注意是通过通配符拼装的字符串 sprintf(p[i], "%d", i + 1); }
代码示例 :
/** * @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 个 一维数组 指向的 字符串 ;
代码示例 :
/** * @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]); } }
3、二维指针排序 函数
排序时 , 交换 二维指针 指向的 一维指针 变量 ; 从大到小 进行排序 ;
代码示例 :
/** * @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 个 一维指针 指向的 内存空间 , 然后释放 二维指针 指向的内存空间 ;
注意 : 上述顺序不要反了 , 否则就出错了 ;
代码示例 :
/** * @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); } }
二、完整代码示例
完整代码示例 :
#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("%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 **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; }
执行结果 :