天天看點

【C 語言】二級指針作為輸入 ( 二維數組 | 二維數組周遊 | 二維數組排序 )

文章目錄

  • 一、二維數組
  • 1、二維數組聲明及初始化
  • 2、二維數組周遊
  • 3、二維數組排序
  • 二、完整代碼示例

一、二維數組

前幾篇部落格中 , 介紹的是指針數組 ;

指針數組 的 結構特征 是 , 數組中的每個元素 , 即每個指針變量 可以 指向不同大小的 記憶體塊 ;

二維數組 與 指針數組 的結構不同 , 二維數組 的 記憶體結構 是整齊的連續的 記憶體塊 , 每個 一維指針 指向的記憶體塊 的大小都是相同的 , 并且這些記憶體塊 還是連續的 ;

1、二維數組聲明及初始化

​二維數組聲明及初始化 :​

// I. 二維數組
    char array[4][10] = {"abc", "123", "258", "sfd"};      

2、二維數組周遊

​二維數組周遊 :​

// II. 列印二維數組中的字元串
    for(i = 0; i < num; i++)
    {
        // 使用數組下标形式通路
        printf("%s\n", array[i]);
        // 使用指針通路
        //printf("%s\n", *(array + i));
    }      

3、二維數組排序

​二維數組排序 :​ 對二維數組進行排序 , 不能單純的交換指針指向 , 二維數組是一塊整體連續的記憶體 , 必須對記憶體中存儲的實際資料進行整體位置交換 ;

// III. 二維數組排序


    // 對 指針數組 進行排序 , 排序依據是 指針 指向的資料對比
    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);
            }
        }
    }      

二、完整代碼示例

​完整代碼示例 :​

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

int main()
{
    // 循環控制變量
    int i = 0, j = 0;
    // 二維數組中的一維數組個數
    int num = 4;

    // 排序時 , 交換指針變量時的臨時變量 , 存儲指針指向的記憶體所存儲的資料
    char tmp[10];

    // I. 二維數組
    char array[4][10] = {"abc", "123", "258", "sfd"};

    // II. 列印二維數組中的字元串
    for(i = 0; i < num; i++)
    {
        // 使用數組下标形式通路
        printf("%s\n", array[i]);
        // 使用指針通路
        //printf("%s\n", *(array + i));
    }


    // III. 二維數組排序


    // 對 指針數組 進行排序 , 排序依據是 指針 指向的資料對比
    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);
            }
        }
    }


    // IV. 列印二維數組中的字元串
    printf("\nSort:\n");
    for(i = 0; i < num; i++)
    {
        // 使用數組下标形式通路
        printf("%s\n", array[i]);
        // 使用指針通路
        //printf("%s\n", *(array + i));
    }


    // 指令行不要退出
    system("pause");
    return 0;
}      

​執行結果 :​