Day05 郝斌C語言自學視頻之C語言的數組

這篇筆記主要是介紹C語言中的數組,包括一維數組,二維數組和多維數組等。閱讀本文預計需要 6 分鐘。

數組概述

爲什麼需要數組

  1. 爲了解決大量同類型數據的存儲問題。

  2. 爲了模擬現實世界。

例 數組的用法

/*
    時間:2020年2月22日10:11:19
    目的:
        數組使用展示
*/

# include <stdio.h>

int main(void)
{
    int a[5] = {1, 2, 3, 4, 5};
        // a是數組的名字,5表示數組元素的個數,並且這5個元素分別用a[0], a[1], a[2], a[3], a[4]表示
    int i;

    for (i=0; i<5; ++i)
        printf("%d\n", a[i]);
    
    printf("%d\n", a[100]); // 訪問到了垃圾數據

    return 0;
}

/*
    在VSCode中的輸出結果是:
--------------------------
1
2
3
4
5
0
--------------------------
*/

數組的不足

語言層次的數組限制比較多,功能有限。比如:要實現一個數組倒置,還需要去從頭開始編寫,十分不方便。對於現實世界的抽象,現在我們會更多的對數組進行整合,集成工具,方便我們直接調用。

數組的分類

數組是對我們現實的抽象,數組分爲一維數組二維數組多維數組

一維數組

一維數組的定義

格式:
  數據類型 數組名[數組元素個數];
舉例:
  int a[5];
解釋:
  定義了一個名爲 a 的數組,a 數組有且只有 5 個元素,並且每個元素的數據類型是 int。注意:一維數組名不代表數組中所有的元素,一維數組名代表數組第一個元素的地址。數組 a 有 a[0], a[1], a[2], a[3], a[4] 這5個元素。

數組定義的本質

  1. 爲 n 個變量連續分配操作空間。

  2. 所有的變量數據類型必須相同。

  3. 所有變量所佔的字節大小必須相同。

有關一維數組的操作

完全初始化
  int a[5] = {1, 2, 3, 4, 5};

不完全初始化,未被初始化元素自動爲0
  int a[5] = {1, 2, 3};

不初始化,所有元素是垃圾值
  int a[5];

清零
  int a[5] = {0}

錯誤示例 1
  int a[5];
  a[5] = {1, 2, 3, 4, 5};
解釋:只有在定義數組的同時纔可以整體賦值,其他情況整體賦值都是錯誤的。這裏 a[5] 表示的是數組 a 的第 6 個元素,明顯超出了定義的範圍,所以錯誤。 a 數組最多取到 a[4],即第 5 個元素。

錯誤示例 2
  int a[5] = {1, 2, 3, 4, 5};
  a[5] = 100;
解釋:錯誤, 因爲沒有數組 a 沒有 a[5] 這個元素,最多是 a[4]

錯誤示例 3
功能:實現把 a 數組中的值全部複製給 b 數組。
錯誤的寫法
  int a[5] = {1, 2, 3, 4, 5};
  int b[5];
  b = a; // error
正確的寫法:
  for (i=0; i<5; ++i)
    b[i] = a[i];

其他一些操作
對於數組的賦值、排序、求最大/最小值、倒置、查找、插入、刪除等操作,留作自己瞭解。

例 一維數組的倒置

/*
    時間:2020年2月22日10:25:30
    功能:
        一維數組倒置
*/

# include <stdio.h>

int main(void)
{
    int a[7] = {1, 2, 3, 4, 5, 6, 7};
    int i, j;
    int t;

    printf("倒置前數組是:");
    for (i=0; i<7; ++i)
    {
         printf("%d ", a[i]);
    }
    printf("\n");
       

    i = 0;
    j=6;
    while (i<j)
    {
        t = a[i];
        a[i] = a[j];
        a[j] = t;

        i++; // ++i
        --j; // j--
    }

    printf("倒置後數組是:");
    for (i=0; i<7; ++i)
    {
         printf("%d ", a[i]);
    }
    printf("\n");
       
    return 0;
}

/*
    在VSCode中的輸出結果是:
--------------------------
倒置前數組是:1 2 3 4 5 6 7  
倒置後數組是:7 6 5 4 3 2 1  
--------------------------
*/

二維數組

二維數組的定義

格式:
  數據類型 數組名[m][n];
舉例:
  int a[3][4];
解釋:
  定義了一個名爲 a 的數組,a 數組有且只有 3*4=12 個元素,並且每個元素的數據類型是 int。注意:數組 a 總共是12個元素,可以當做 3 行 4 列看待,這12個元素的名字依次是:

a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]

a[i][j] 表示第 i+1 行第 j+1 列的元素。
int a[m][n]; 該二維數組右下角位置的元素最多隻能是 a[m-1][n-1].

二維數組的初始化

方式一相對沒有那麼直觀,不太推薦。
  int a[3][4] = {1, 2, 3, 4, 5, 6, , 8, 9, 10, 11, 12};\

方式二推薦:

    int a[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };

二維數組的操作

二維數組的操作包括:輸出二維數組內容、對二維數組排序、求每一行的最大值、判斷矩陣是否對稱、矩陣的相乘等

例 輸出二維數組內容

/*
    時間:2020年2月22日10:40:20
    目的:
        輸出二維數組內容
    總結:
        1. 輸出二維數組內容需要用到兩層循環
*/

#include <stdio.h>

int main(void)
{
    int a[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };

    int i, j;

    // 輸出數組內容
    for (i=0; i<3; ++i)
    {
        for (j=0; j<4; ++j)
        {
            printf("%-5d",a[i][j]); // %-5d 表示左對齊,每個數佔用5個字節
        }
        printf("\n");
    }

    return 0;
}

/*
    在VSCode中的輸出結果是:
--------------------------
1 2 3 4    
5 6 7 8    
9 10 11 12
--------------------------
*/

多維數組

實際上是不存在多維數組的,因爲在計算機硬件中,內存是線性一維的。

所以 n 維數組可以當做每個元素是 n-1 維數組的一維數組

比如:
  int a[3][4];
該數組是含有3個元素的一維數組,只不過每個元素可以再分成 4 個小元素。
  int a[3][4][5];
該數組是含有3個元素的一維數組,只不過每個元素都是 4 行 5 列的二維數組。

說明

  1. 本學習筆記整理自B站郝斌老師的《郝斌C語言自學教程》片段P97-P103

  2. 筆記中所有代碼均在windows10操作系統,在VSCode編輯器中通過測試。具體VSCode C語言開發環境搭建方法請參照我的另一篇CSDN博客——Windows10下利用Visual Studio Code搭建C語言開發環境

後記

如果對你有所幫助,歡迎關注我的公衆號。這個公衆號主要是慢慢分享和記錄自己學習編程的筆記,比如:C,Python,Java等。後續也會分享自己面試以及在職場上的成長心得。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章