【C 语言】二级指针作为输入 ( 指针数组 | 将 二级指针 作为函数输入 | 抽象函数业务逻辑 )
2023-06-13 09:18:00 时间
文章目录
一、打印 指针数组 中指针指向的字符串
打印 指针数组 中指针指向的字符串 :
- 指针退化问题 : 传入二级指针 , 同时还要传入 一级指针的个数 ; 实参是 指针数组 , 形参 退化为 二级指针 , 需要人为指定 数组的元素个数 ;
- 验证指针合法性 : 函数中 , 只要是指针 , 就有可能为 NULL , 函数入口就要验证该指针合法性 ;
/*
* 打印函数
*/
int printf_array(char **array, int num)
{
// 验证指针合法性
if(array == NULL || num <= 0)
{
printf("error : array == NULL || num <= 0\n");
return -1;
}
// 循环控制变量
int i = 0;
// 打印上述数组
for(i = 0; i < num; i++)
{
// 使用 数组下标 与 指针 进行遍历 , 效果相同
//printf("%s\n", array[i]);
printf("%s\n", *(array + i));
}
return 0;
}
二、字符串排序
将 指针数组 作为参数 , 传入函数中 ;
函数的 二级指针 形参 , 既要作为 输入 , 又要作为输出 ;
int sort_array(char **array, int num)
{
// 验证指针合法性
if(array == NULL || num <= 0)
{
printf("error : array == NULL || num <= 0\n");
return -1;
}
// 循环控制变量
int i = 0, j = 0;
// 排序时 , 交换指针变量时的临时变量
char *tmp;
// 对 指针数组 进行排序 , 排序依据是 指针 指向的数据对比
for(i = 0; i < num; i++)
{
for(j = i; j < num; j++)
{
// 核心逻辑 : 如果 array[i] 大于 array[j]
// 就交换两个元素
if(strcmp(array[i], array[j]) > 0)
{
// 交换 i, j 位置的指针变量
tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
}
return 0;
}
三、代码示例
完整代码示例 :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* 打印函数
*/
int printf_array(char **array, int num)
{
// 验证指针合法性
if(array == NULL || num <= 0)
{
printf("error : array == NULL || num <= 0\n");
return -1;
}
// 循环控制变量
int i = 0;
// 打印上述数组
for(i = 0; i < num; i++)
{
// 使用 数组下标 与 指针 进行遍历 , 效果相同
//printf("%s\n", array[i]);
printf("%s\n", *(array + i));
}
return 0;
}
int sort_array(char **array, int num)
{
// 验证指针合法性
if(array == NULL || num <= 0)
{
printf("error : array == NULL || num <= 0\n");
return -1;
}
// 循环控制变量
int i = 0, j = 0;
// 排序时 , 交换指针变量时的临时变量
char *tmp;
// 对 指针数组 进行排序 , 排序依据是 指针 指向的数据对比
for(i = 0; i < num; i++)
{
for(j = i; j < num; j++)
{
// 核心逻辑 : 如果 array[i] 大于 array[j]
// 就交换两个元素
if(strcmp(array[i], array[j]) > 0)
{
// 交换 i, j 位置的指针变量
tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
}
return 0;
}
void main()
{
// 循环控制变量
int i = 0, j = 0;
// 数组大小
int num = 0;
// 排序时 , 交换指针变量时的临时变量
char *tmp;
/*
* 复杂指针阅读
* 参考 https://blog.csdn.net/shulianghan/article/details/121453520 和
* https://hanshuliang.blog.csdn.net/article/details/78568351#3____________________2803
* 博客章节进行阅读
*
* 复杂指针解析流程 :
* 1. 中心标识符是 array
* 2. 先往右看 , 遇到 [] , 说明这是一个数组 , 挖掉 array[] 内容 , 然后调转方向往左看
* 3. 发现是 * , 说明数组中的元素是指针 , 挖掉 * , 往右看没内容 , 往左看
* 4. 发现是 char , 说明指针指向的数据是 char 类型
*
* array 是一个数组 , 数组中的元素的 char * 字符串
*
* 这是 指针数组 , 数组元素 是 指针
*/
char *array[] = {"abc", "123", "258", "sfd"};
// 计算数组大小
num = sizeof(array) / sizeof(array[0]);
// 打印数组
printf_array(array, num);
// 对 指针数组 进行排序 , 排序依据是 指针 指向的数据对比
sort_array(array, num);
// 打印排序后的数组
printf("\nSort:\n");
printf_array(array, num);
// 命令行不要退出
system("pause");
return;
}
执行结果 :
相关文章
- springboot jpa 中使用逻辑删除[通俗易懂]
- .Net 7 GC垃圾回收二叉树构建逻辑
- 微信小程序(逻辑层的全部知识点)保姆级讲解
- 谓词逻辑
- R语言随机森林RandomForest、逻辑回归Logisitc预测心脏病数据和可视化分析|附代码数据
- React源码学习进阶(四)render流程的入口逻辑详解
- 测试用例设计的底层逻辑
- 数据分享|逻辑回归、随机森林、SVM支持向量机预测心脏病风险数据和模型诊断可视化|附代码数据
- 特征选择 | 逻辑回归-通过系数符号和VIF进一步筛选变量-R版本
- 怎样用 Bash 编程:逻辑操作符和 shell 扩展
- 代码审计之逻辑上传漏洞挖掘
- 备份MSSQL数据库实施逻辑备份指南(mssql逻辑)
- Redis双写一致性操作引导你轻松运行(redis运行逻辑)