文章目录
- 一、二级指针排序 ( 抽象业务逻辑函数 )
- 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;
}
执行结果 :