【C 语言】二级指针作为输入 ( 二维数组 | 抽象业务函数 | 二维数组打印函数 | 二维数组排序函数 )

举报
韩曙亮 发表于 2022/01/13 23:44:16 2022/01/13
1.3k+ 0 0
【摘要】 文章目录 一、抽象 二维数组 业务函数1、二维数组 打印函数2、二维数组 排序函数 二、完整代码示例 一、抽象 二维数组 业务函数 1、二维数组 打印函数 ...





一、抽象 二维数组 业务函数




1、二维数组 打印函数


注意 , 二维数组 作为 函数参数 输入到函数中 , 不能传入 二维指针 ;

此处遍历时 , 注意指针的步长 ,传入一个二级指针 char ** , 会出错 , 如果传入 二级指针 , array[i] 等同于 *(array + i) , array 的步长是 10 ;

这里将 函数形参 定义为 char array[4][10] ;


代码示例 :

/*
 * 此处遍历时 , 注意指针的步长 ,
 * 传入一个二级指针 char ** , 会出错
 * 如果传入 二级指针 ,
 * array[i] 等同于 *(array + i)
 * array 的步长是 10
 */
int print_str(char array[4][10], int num)
{
    // 循环控制变量
    int i = 0;

    // 判断指针合法性
    if(array == NULL)
    {
        printf("array == NULL\n");
        return -1;
    }

    // 打印二维数组中的字符串
    for(i = 0; i < num; i++)
    {
        // 使用数组下标形式访问
        printf("%s\n", array[i]);
        // 使用指针访问
        //printf("%s\n", *(array + i));
    }

    return 0;
}

  
 

2、二维数组 排序函数


二维数组排序时 , 也不能传入二维指针作为形参 , 需要传入 char array[4][10] 作为形参 ;


代码示例 :

/*
 * 二维数组
 */
int sort_array(char array[4][10], int num)
{
    // 循环控制变量
    int i = 0, j = 0;
    // 排序时 , 交换指针变量时的临时变量 , 存储指针指向的内存所存储的数据
    char tmp[10];

    // 判断指针合法性
    if(array == NULL)
    {
        printf("array == NULL\n");
        return -1;
    }

    // 二维数组排序
    // 对 指针数组 进行排序 , 排序依据是 指针 指向的数据对比
    for(i = 0; i < num; i++)
    {
        for(j = i + 1; j < num; j++)
        {
            // 核心逻辑 : 如果 array[i] 大于 array[j]
            //          就交换两个元素
            if(strcmp(array[i], array[j]) > 0)
            {
                // 交换 i, j 位置的指针指向的内存数据
                strcpy(tmp, array[i]);
                strcpy(array[i], array[j]);
                strcpy(array[j], tmp);
            }
        }
    }

    return 0;
}

  
 




二、完整代码示例



完整代码示例 :

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

/*
 * 此处遍历时 , 注意指针的步长 ,
 * 传入一个二级指针 char ** , 会出错
 * 如果传入 二级指针 ,
 * array[i] 等同于 *(array + i)
 * array 的步长是 10
 */
int print_str(char array[4][10], int num)
{
    // 循环控制变量
    int i = 0;

    // 判断指针合法性
    if(array == NULL)
    {
        printf("array == NULL\n");
        return -1;
    }

    // 打印二维数组中的字符串
    for(i = 0; i < num; i++)
    {
        // 使用数组下标形式访问
        printf("%s\n", array[i]);
        // 使用指针访问
        //printf("%s\n", *(array + i));
    }

    return 0;
}

/*
 * 二维数组
 */
int sort_array(char array[4][10], int num)
{
    // 循环控制变量
    int i = 0, j = 0;
    // 排序时 , 交换指针变量时的临时变量 , 存储指针指向的内存所存储的数据
    char tmp[10];

    // 判断指针合法性
    if(array == NULL)
    {
        printf("array == NULL\n");
        return -1;
    }

    // 二维数组排序
    // 对 指针数组 进行排序 , 排序依据是 指针 指向的数据对比
    for(i = 0; i < num; i++)
    {
        for(j = i + 1; j < num; j++)
        {
            // 核心逻辑 : 如果 array[i] 大于 array[j]
            //          就交换两个元素
            if(strcmp(array[i], array[j]) > 0)
            {
                // 交换 i, j 位置的指针指向的内存数据
                strcpy(tmp, array[i]);
                strcpy(array[i], array[j]);
                strcpy(array[j], tmp);
            }
        }
    }

    return 0;
}
int main()
{
    // 循环控制变量
    int i = 0, j = 0;
    // 二维数组中的一维数组个数
    int num = 4;

    // 排序时 , 交换指针变量时的临时变量 , 存储指针指向的内存所存储的数据
    char tmp[10];

    // I. 二维数组
    char array[4][10] = {"abc", "123", "258", "sfd"};

    // II. 打印二维数组中的字符串
    print_str(array, num);
    // III. 二维数组排序
    // 对 指针数组 进行排序 , 排序依据是 指针 指向的数据对比
    sort_array(array, num);
    // IV. 打印二维数组中的字符串
    printf("\nSort:\n");
    print_str(array, num);
    // 命令行不要退出
    system("pause");
    return 0;
}
  
 

执行结果 :
在这里插入图片描述

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/121558995

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。