【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 通过 交换指针指向的内存数据 方式进行排序 )

简介: 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 通过 交换指针指向的内存数据 方式进行排序 )

文章目录

一、二维指针 排序 ( 通过 交换指针指向的内存数据 方式进行排序 )

二、完整代码示例





一、二维指针 排序 ( 通过 交换指针指向的内存数据 方式进行排序 )


在上一篇博客 【C 语言】二级指针作为输入 ( 二维指针 | 为 二维指针 分配内存 - 存放 一维指针 | 为每个 一维指针 分配内存 | 释放二维指针内存 ) 基础上 , 对 二维指针 指向的 若干 一维指针 指向的数据 进行排序 ;



首先 , 准备好了循环控制变量 , 和 排序 交换 时 , 使用的 中间变量 ;


循环控制变量 : 排序一般需要定义两个变量 ;

 

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


排序时 , 交换指针指向的内存数据 , 该数组是存储 要 交换内存数据 的临时变量 ;

 

// 排序时 , 交换指针指向的内存数据
    // 该数组是存储 要 交换内存数据 的临时变量
    char tmp[30];



然后 , 对二维指针指向的数据 , 进行排序 ; 涉及到使用 strcmp 函数 , 参考 【C 语言】二级指针作为输入 ( 指针数组 | 指针数组排序 | 字符串排序 | strcmp 函数 ) 一、strcmp 函数 博客章节 , 进行理解 ;


 

// 对 二维指针 指向的数据进行排序
    for(i = 0; i < num; i++)
    {
        for(j = i + 1; j < num; j++)
        {
            // 交换 i , j 指针指向的内存数据
            // 从 大 到 小 进行排序
            if(strcmp(p[i], p[j]) < 0)
            {
                strcpy(tmp, p[i]);
                strcpy(p[i], p[j]);
                strcpy(p[j], tmp);
            }
        }
    }






二、完整代码示例


完整代码示例 :


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    // 二维指针 指向的 一维指针 个数
    int num = 4;
    // 声明二维指针
    char **p = NULL;
    // 循环控制变量
    int i = 0, j = 0;
    // 排序时 , 交换指针 , 该指针是存储 要 交换指针 的临时变量
    //char *tmp = NULL;
    // 排序时 , 交换指针指向的内存数据
    // 该数组是存储 要 交换内存数据 的临时变量
    char tmp[30];
    // 在堆内存中 , 分配一块内存空间
    // 用于存储 num 个 一维指针
    // 每个 一维指针 指向一块内存空间
    p = (char **)malloc( sizeof(char*) * num );
    // 遍历 二维指针 指向的多个 一维指针
    // 并为每个 一维指针 在堆内存中 分配 20 字节内存
    for(i = 0; i < num; i++)
    {
        // 为每个字符分配 20 字节空间
        p[i] = (char *)malloc(sizeof (char) * 20);
        // 向内存中写入 字符串 , 字符串内容是 i + 1
        // 注意是通过通配符拼装的字符串
        sprintf(p[i], "%d", i + 1);
    }
    // 打印字 二维指针 指向的 num 个 一维数组 指向的 字符串
    for(i = 0; i < num; i++)
    {
        printf("%s\n", p[i]);
    }
    // 对 二维指针 指向的数据进行排序
    for(i = 0; i < num; i++)
    {
        for(j = i + 1; j < num; j++)
        {
            // 交换 i , j 指针指向的内存数据
            // 从 大 到 小 进行排序
            if(strcmp(p[i], p[j]) < 0)
            {
                strcpy(tmp, p[i]);
                strcpy(p[i], p[j]);
                strcpy(p[j], tmp);
            }
        }
    }
    // 打印字 二维指针 指向的 num 个 一维数组 指向的 字符串
    printf("\nSort : \n");
    for(i = 0; i < num; i++)
    {
        printf("%s\n", p[i]);
    }
    // 释放内存
    // 先释放 num 个 一级指针
    for(i = 0; i < num; i++)
    {
        if(p[i] != NULL)
        {
            free(p[i]);
            p[i] = NULL;
        }
    }
    // 再释放 二级指针
    if(p != NULL)
    {
        free(p);
    }
    // 命令行不要退出
    system("pause");
    return 0;
}



执行结果 :

image.png


目录
相关文章
|
6月前
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
158 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
7月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
173 6
|
7月前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
7月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
163 1
|
C语言
C语言---指针进阶
C语言---指针进阶
|
C语言
C语言指针进阶(下)
C语言指针进阶(下)
85 1
|
编译器 C语言
C语言指针进阶(上)
C语言指针进阶(上)
120 1
|
C语言
通过模拟实现计算器介绍函数指针数组和回调函数的用法【C语言/指针/进阶】
通过模拟实现计算器介绍函数指针数组和回调函数的用法【C语言/指针/进阶】
119 0
|
C语言
C语言指针进阶(中)
C语言指针进阶(中)
76 0
|
存储 C语言 C++
C语言指针进阶-1
C语言指针进阶-1
65 1