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