這篇筆記主要是介紹C語言中的數組,包括一維數組,二維數組和多維數組等。閱讀本文預計需要 6 分鐘。
Day05 郝斌C語言自學視頻之C語言的數組
數組概述
爲什麼需要數組
-
爲了解決大量
同類型數據
的存儲問題。 -
爲了模擬現實世界。
例 數組的用法
/*
時間: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個元素。
數組定義的本質
-
爲 n 個變量
連續分配
操作空間。 -
所有的變量數據類型必須相同。
-
所有變量所佔的字節大小必須相同。
有關一維數組的操作
完全初始化
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 列的二維數組。
【說明】
-
本學習筆記整理自B站郝斌老師的《郝斌C語言自學教程》片段P97-P103。
-
筆記中所有代碼均在windows10操作系統,在VSCode編輯器中通過測試。具體VSCode C語言開發環境搭建方法請參照我的另一篇CSDN博客——Windows10下利用Visual Studio Code搭建C語言開發環境。
後記
如果對你有所幫助,歡迎關注我的公衆號。這個公衆號主要是慢慢分享和記錄自己學習編程的筆記,比如:C,Python,Java等。後續也會分享自己面試以及在職場上的成長心得。