C语言从青铜到王者——数组详解总结【一维数组、二维数组、字符数组、数组实例】
所謂數(shù)組,是指將那些具有相同類型的、數(shù)量有限的若干個變量通過有序的方法組織起來的一種便于使用的形式。數(shù)組屬于一種構(gòu)造類型,其中的變量被稱為數(shù)組的元素。數(shù)組元素的類型可以是基本數(shù)據(jù)類型,也可以是特殊類型和構(gòu)造類型。
一維數(shù)組
一位數(shù)組是最簡單的數(shù)組類型,它的定義形式如下:
類型說明符 數(shù)組名[常量表達式]
類型說明符是數(shù)組中每個元素的類型,常量表達式是數(shù)組元素的個數(shù)
在使用一維數(shù)組的時候需要留意以下兩個要點
- 常量表達式的值必須是正整數(shù)
- 數(shù)組元素的引用,數(shù)組的起始元素下標(biāo)為0
下來我們通過一個簡單的示例了解一下數(shù)組
代碼如下:
#include<stdio.h> #define N 9 int main(void) {int arr[N];int i;for (i = 0; i < N; i++){arr[i] = i + 1;printf("arr[%d]=%d\t", i, arr[i]);if (0 == (i+1)%3){printf("\n");}}return 0; }運行結(jié)果如下:
我們分析一下上面這段代碼
我們定義了一個含有9個元素的一位數(shù)組arr,在引用數(shù)組中的元素時,采用"數(shù)組名[下標(biāo)]"的方式,將其中的每一個元素視為一個普通的變量來進行操作。需要注意的是,因為定義的數(shù)組arr僅含有9個元素,所以在使用的過程中,下標(biāo)值不能超過8,否則就會出現(xiàn)下標(biāo)越界的錯誤,示例如下:
在使用數(shù)組的時候要特別注意數(shù)組越界,不然很有可能為自己埋下一顆雷(bug)。
接下來我們我們通過一段代碼看一下數(shù)組在內(nèi)存中是如何存放的
#include<stdio.h> #define N 4 int main(void) {int arr[N];int i;for (i = 0; i < N; i++){arr[i] = i;printf("&arr[%d]=%d\n", i, &arr[i]);}return 0; }運行結(jié)果如下:
從結(jié)果我們可以看出,每個元素占用4個字節(jié),在內(nèi)用中的存儲結(jié)構(gòu)圖如下:
最后我們再通過一個示例來鞏固一下一維數(shù)組
需求:使用數(shù)組保存用戶輸入的數(shù)據(jù),當(dāng)輸入完畢后逆向輸出
代碼如下:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #define N 5 int main(void) {int arr[N];//定義數(shù)組int i, temp;//定義變量printf("請輸入一個5個元素數(shù)組:\n");for (i = 0; i < N; i++){scanf("%d", &arr[i]);}printf("讀取到的數(shù)組如下:\n");for (i = 0; i < N; i++){printf("%d ",arr[i]);}printf("\n");for (i = 0; i < 2; i++)//將數(shù)組中元素的前后位置互換{temp = arr[i];arr[i] = arr[4 - i];arr[4 - i] = temp;}printf("輸出的逆向數(shù)組如下:\n");for (i = 0; i < N; i++){printf("%d ", arr[i]);}return 0; }運行結(jié)果如下:
二維數(shù)組
二維數(shù)組定義的一般形式如下:
類型說明符 數(shù)組名[常量表達式1][常量表達式2]
與一維數(shù)組的定義唯一的不同是多了一個常量表達式2,其中,常量表達式1為第一維的長度,常量表達式2為第二維的長度。通常在處理二維數(shù)組的時候,為了便于理解,都將數(shù)組視為一個矩陣,常量表達式1表示矩陣的行數(shù),而常量表達式2表示矩陣的列數(shù)。與一維數(shù)組一樣,在定義二維數(shù)組時,常量表達式同樣不能為變量。下面先通過一段代碼來看二維數(shù)組的定義。
#include<stdio.h>#define M 4 #define N 3int main() {int arr[M][N];for (int i = 0; i < M; i++){for (int j = 0; j < N; j++){printf("&arr[%d][%d]=%d\t", i, j, &arr[i][j]);}printf("\n");}return 0; }運行結(jié)果:
將二維數(shù)組arr視為一個矩陣,下圖顯示了數(shù)組中每個元素在矩陣中的存放位置。
數(shù)組中各個元素在矩陣中對應(yīng)的位置由二維數(shù)組的兩個下標(biāo)決定。我們可以將定義的二維數(shù)組int arr[4][3]視為由arr[4]和int [3] 兩部分構(gòu)成,將arr[4]視為一個整型一維數(shù)組,其中含有4個元素arr[0]、arr[1]、arr[2]、arr[3],每個元素都是int[3]類型的,也就是說,每個元素又是一個一維數(shù)組,每個一維數(shù)組含有3個元素,如arr[0]含有arr[0][1]、arr[0][1]、arr[0][2]三個元素。
知道了二維數(shù)組的這種特殊結(jié)構(gòu)之后,接下來通過下圖來了解二維數(shù)組在內(nèi)存中的存儲結(jié)構(gòu)。
通過上述二維數(shù)組在內(nèi)存中的存儲結(jié)構(gòu)圖可以發(fā)現(xiàn),二維數(shù)組中的所有元素都存儲在一片連續(xù)的內(nèi)存單元中,所占用的內(nèi)存大小為元素類型所占用的內(nèi)存大小乘以第一維及第二維的長度。如果以矩陣的方式來分析二維數(shù)組的存儲方式,那么先從矩陣第一行從左往右依次存儲完所有元素,然后按照同樣的方法存儲第二行的所有元素,直到存儲完所有數(shù)組元素為止。
接下來再看一個二維數(shù)組的示例:
任意輸入一個3行3列的二維數(shù)組,求對角元素之和
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h>int main() {int arr[3][3];int i, j, sum = 0;printf("please input:\n");for (i = 0; i < 3; i++){for (j = 0; j < 3; j++){scanf("%d", &arr[i][j]);}}for (i = 0; i < 3; i++){for ( j = 0; j < 3; j++){if (i==j){sum += arr[i][j];}}}printf("the result is: %d\n", sum);return 0; }運行結(jié)果如下:
字符數(shù)組
字符數(shù)組顧名思義就是數(shù)組的元素類型為字符型的數(shù)組。特殊之處在于它是數(shù)組元素為字符的數(shù)組。其定義的一般形式和注意事項與之前講解的一般數(shù)組類似,只是其中的類型說明符是char。當(dāng)然,并不是說類型說明符只能是char,也可以是long、int等,但是由于char型只占用一個字節(jié)的大小,使用long型和int型來定義字符數(shù)組會造成資源的浪費,因此一般選擇使用char型來定義字符數(shù)組。
一維字符數(shù)組
首先通過下面一段代碼來看看一維字符數(shù)組的定義。
運行結(jié)果:
在上面的代碼中定義了不同類型的字符數(shù)組來存放相同的字符,可以看出,它們占用的內(nèi)存大小相差很大,long型字符數(shù)組所占用內(nèi)存大小是char型數(shù)組占用內(nèi)存大小的4倍。從這點可以看出,選用char型作為數(shù)組類型避免了內(nèi)存空間的浪費。下面通過一段代碼來了解字符數(shù)組的初始化特點。
運行結(jié)果:
運行結(jié)果為“Hello World!”,其中有一些空字符。看看上面代碼中定義的arr數(shù)組,其數(shù)組長度為20,而初始化的字符元素的個數(shù)為12,初始化的字符元素個數(shù)小于數(shù)組長度,編譯器在編譯過程中將后面沒有初始化的數(shù)組元素賦值為‘\0’,這也正是打印輸出中含有空字符的原因。在打印的時候也可以將數(shù)組中的元素‘\0’視為數(shù)組結(jié)束的標(biāo)志,例如:
運行結(jié)果:
這時的輸出結(jié)果中就不含有任何空字符了,因為巧妙地使用了字符數(shù)組中的‘\0’標(biāo)志。當(dāng)然,也可以采用字符串常量的方式來對一維字符數(shù)組進行初始化,例如:
運行結(jié)果:
在對一維字符數(shù)組進行定義和初始化的過程中,可以不指定其長度。使用字符常量列表和字符串常量的方式進行初始化的結(jié)果是不同的,例如:
運行結(jié)果:
從運行結(jié)果發(fā)現(xiàn),采用這兩種方式得到的數(shù)組長度并不相同,在采用字符串常量對字符數(shù)組進行初始化的過程中,在內(nèi)存中進行存儲時會自動在字符串的后面添加一個結(jié)束符‘\0’,所以得到的字符數(shù)組長度是字符串常量的長度加1;而采用字符常量列表的方式對字符數(shù)組進行初始化就不會在最后添加一個結(jié)束符,所以利用這種方式定義的字符數(shù)組的長度就是字符常量列表中字符的個數(shù)。
數(shù)組實例
交換數(shù)組中最大數(shù)和最小數(shù)的位置
實例代碼
// // Created by 沖哥 on 2021/22/09. // 實現(xiàn)功能:交換數(shù)組中最大數(shù)和最小數(shù)的位置 //#include "stdio.h"int main(){int a[10];int max, min;int m, n;printf("請輸入10個數(shù)字:\n");for (int i = 0; i < 10; i++) {scanf("%d", &a[i]);}printf("輸入的10個數(shù)是:\n");for (int i = 0; i < 10; i++) {printf("%4d", a[i]);}printf("\n");max = a[0];for (int i = 0; i < 10; i++) {if (a[i] > max) {max = a[i];m = i;}}min = a[0];for (int i = 0; i < 10; i++) {if (a[i] < min) {min = a[i];n = i;}}a[m] = min;a[n] = max;printf("交換最大數(shù)和最小數(shù)的位置后:\n");for (int i = 0; i < 10; i++) {printf("%4d", a[i]);} }運行結(jié)果
程序分析
首先找到數(shù)組中的最大值和最小值,記錄它們的位置,然后交換位置,最后將交換后的數(shù)組輸出。
如果您覺得本篇文章對您有幫助就順手點個贊吧
更多干貨內(nèi)容請查看我的個人公眾號:C語言中文社區(qū)。
【C語言中文社區(qū)】是一個C語言/C++視頻教程、學(xué)習(xí)筆記、電子書、計算機二級資料等專注于C語言/C++編程學(xué)習(xí)者的干貨知識分享平臺,精選深度文章,分享優(yōu)秀干貨類、技能類的學(xué)習(xí)資源,幫助學(xué)習(xí)中的你。
總結(jié)
以上是生活随笔為你收集整理的C语言从青铜到王者——数组详解总结【一维数组、二维数组、字符数组、数组实例】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言从青铜到王者——基础知识总结
- 下一篇: C语言实例第1期:十进制数转换二进制数