?? 歡迎大家來(lái)到貝蒂大講堂??
????養(yǎng)成好習(xí)慣,先贊后看哦~????
所屬專(zhuān)欄:C語(yǔ)言學(xué)習(xí)
貝蒂的主頁(yè):Betty‘s blog
引言
前面貝蒂給大家介紹了選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu),今天,貝蒂準(zhǔn)備給大家介紹C語(yǔ)言中一個(gè)非常重要的結(jié)構(gòu)——數(shù)組
1. 數(shù)組的定義
數(shù)組到底是什么呢,顧名思義就是很多數(shù)的集合,其大致滿足下面兩個(gè)條件:
這些數(shù)的類(lèi)型必須相同。
這些數(shù)在內(nèi)存中必須是連續(xù)存儲(chǔ)的。
- 換句話說(shuō),數(shù)組就是在內(nèi)存中連續(xù)存儲(chǔ)的具有相同類(lèi)型的一組數(shù)據(jù)的集合。
- 數(shù)組分為?維數(shù)組和多維數(shù)組,多維數(shù)組?般?較多?的是?維數(shù)組。
2. 一維數(shù)組
2.1創(chuàng)建與初始化
(1) 創(chuàng)建
一維數(shù)組的定義方式如下:
類(lèi)型說(shuō)明符 數(shù)組名[常量表達(dá)式];
類(lèi)型說(shuō)明符就是我們常用的存儲(chǔ)類(lèi)型(char int float double....),當(dāng)然也可以自定義類(lèi)型。
數(shù)組名就是我們?yōu)槠淙〉拿?,最好?jiǎn)單易懂,方便別人閱讀。
[] 中的常量值是?來(lái)指定數(shù)組的??的,這個(gè)數(shù)組的??是根據(jù)實(shí)際的需求指定就?
- 注意:在C99之后C語(yǔ)言語(yǔ)法是支持變長(zhǎng)數(shù)組的,即[]中可以是未知數(shù),但是VS2022編譯器是不支持的。
例如:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-837846.html
int arr[5];//表示此時(shí)數(shù)組arr中有 5 個(gè)元素,每個(gè)元素都是 int 型變量
char arr2[6];
float arr3[7];
double arr4[1 + 4];//也可以是一個(gè)表達(dá)式
(2) 初始化
有時(shí)候,數(shù)組在創(chuàng)建的時(shí)候,我們需要給定?些初始值,這種就稱(chēng)為初始化。那數(shù)組如何初始化呢?數(shù)組的初始化?般使??括號(hào),將需要初始化的數(shù)據(jù)放在?括號(hào)中。
初始化分為兩種:完全初始化和不完全初始化
int arr1[4] = { 1,2,3,4 };//完全初始化
int arr2[4] = { 1,2,3 };//不完全初始化,剩余元素默認(rèn)為0
char arr3[10] = "hello ";//初始化字符串
int arr4[];//錯(cuò)誤初始化
- 如果進(jìn)行初始化,可以不在[]聲明有幾個(gè)元素,數(shù)組會(huì)默認(rèn)初始化幾個(gè)元素,數(shù)組大小就是幾個(gè)元素,但是不初始化就一定要聲明有幾個(gè)元素,否則就會(huì)報(bào)錯(cuò)。
2.2 數(shù)組輸入和輸出
(1) 數(shù)組下標(biāo)
C語(yǔ)?規(guī)定數(shù)組是有下標(biāo)的,下標(biāo)是從0開(kāi)始的(而不是1),假設(shè)數(shù)組有n個(gè)元素,最后?個(gè)元素的下標(biāo)是n-1,例如:int arr[10]={1,2,3,4,5,6,7,8,9,10},其下標(biāo)如下圖所示:
arr | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
下標(biāo) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
(2) 輸入
其實(shí)數(shù)組輸入和我們平常輸入差不多,只是輸入對(duì)象換成了數(shù)組。
int main()
{
int arr[10];
int i = 0;
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);//循環(huán)像數(shù)組中輸入元素
}
return 0;
}
(3) 輸出
輸出也是同理,我們可以利用循環(huán)輸出其數(shù)組的每一個(gè)元素。
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);//循環(huán)輸出
}
return 0;
}
2.3 數(shù)組的內(nèi)存存儲(chǔ)
(1) 數(shù)組名
C語(yǔ)言規(guī)定數(shù)組名表示首元素地址,也就是說(shuō)arr==&arr[0],我們可以通過(guò)以下代碼來(lái)證明:
int main()
{
int arr[2] = { 1,2 };
if (arr == &arr[0])
{
printf("地址相同\n");
}
else
{
printf("地址不相同");
}
return 0;
}
(2) 數(shù)組元素的存儲(chǔ)
我們知道了數(shù)組名表示首元素的地址之后,那么接下來(lái)我們可以探究數(shù)組每個(gè)元素在內(nèi)存中又是怎樣存儲(chǔ)的呢,我們將其每個(gè)元素的地址打印出觀察。
#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
for (i = 0; i < 10; i++)
{
printf(" &arr[%d] = %p\n ", i, &arr[i]);
}
return 0;
}
輸出結(jié)果:
從上述地址觀察,地址是由?到?變化的,90,94,98......每次的增量是4,并且我們發(fā)現(xiàn)每?jī)蓚€(gè)相鄰的元素之間相差4(因?yàn)?strong>?個(gè)整型是4個(gè)字節(jié)),就可以很容易得出結(jié)論:數(shù)組在內(nèi)存中存儲(chǔ)是連續(xù)的,理解到這一點(diǎn),就能為以后指針的學(xué)習(xí)打好基礎(chǔ)。
arr | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
下標(biāo) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
2.4 一維數(shù)組例題
題目:求任意十個(gè)整數(shù)的和與平均數(shù)。
思路:我們可以先將十個(gè)數(shù)輸入一個(gè)數(shù)組中,然后循環(huán)求其和,在求平均數(shù)。
- 注意:雖然是是個(gè)整數(shù),但是最后結(jié)果可能是浮點(diǎn)數(shù)。
代碼參考如下:
int main()
{
int arr[10];
int i = 0;
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);//循環(huán)輸入
}
int sum = 0;//和
for (i = 0; i < 10; i++)
{
sum += arr[i];
}
float avr = sum / 10.0;
printf("這十個(gè)數(shù)和為%d平均數(shù)為%.1f", sum,avr);
return 0;
}
3. 二維數(shù)組
前?我們學(xué)習(xí)的數(shù)組被稱(chēng)為?維數(shù)組,數(shù)組的元素都是內(nèi)置類(lèi)型的,如果我們把?維數(shù)組做為數(shù)組的元素創(chuàng)建數(shù)組,這時(shí)候就是?維數(shù)組,?維數(shù)組作為數(shù)組元素的數(shù)組被稱(chēng)為三維數(shù)組,?維數(shù)組以上的數(shù)組統(tǒng)稱(chēng)為多維數(shù)組。
3.1 創(chuàng)建與初始化
(1) 創(chuàng)建
二維數(shù)組定義的一般形式為:
- 類(lèi)型說(shuō)明符 數(shù)組名[ 常量表達(dá)式][ 常量表達(dá)式];
- 類(lèi)比一維數(shù)組的定義,只不過(guò)二維數(shù)組第一個(gè)常量表達(dá)式表示行,第二個(gè)常量表達(dá)式表示列。
例如:
int arr[5][5];//創(chuàng)建五行五列的二維數(shù)組
char arr2[3][5];//字符型二維數(shù)組
float arr3[4][5];//浮點(diǎn)型二維數(shù)組
(2) 初始化
二維數(shù)組的初始化和一維數(shù)組的初始化類(lèi)似,像?維數(shù)組?樣,也是使??括號(hào)初始化的。
int arr1[3][3] = { 1,2 };//不完全初識(shí)化
示意圖:
1 | 2 | 0 |
---|---|---|
0 | 0 | 0 |
0 | 0 | 0 |
- 不完全初始化剩下元素默認(rèn)初始化為0。
int arr2[3][3] = { 1,2,3,4,5,6,7,8,9 };//完全初始化
示意圖:
1 | 2 | 3 |
---|---|---|
4 | 5 | 6 |
7 | 8 | 9 |
int arr3[3][3] = { {1,2},{2,3} };//按照行初始化
示意圖:
1 | 2 | 0 |
---|---|---|
2 | 3 | 0 |
0 | 0 | 0 |
- 按行初始化,剩下未初始化的元素默認(rèn)為0.
int arr4[][3] = { 1,2,3 };//省略行
? 示意圖:
1 | 2 | 3 |
---|
int arr5[3][];//錯(cuò)誤初始化
int arr6[][];//錯(cuò)誤初始化
- 二維數(shù)組規(guī)定只能省略行,不能省略列。
3.2數(shù)組的輸入和輸出
(1) 數(shù)組下標(biāo)
?維數(shù)組訪問(wèn)和一維數(shù)組類(lèi)似,也是使?下標(biāo)的形式的,?維數(shù)組是有?和列的,只要鎖定了?和列就能唯?鎖定數(shù)組中的?個(gè)元素。C語(yǔ)?規(guī)定,?維數(shù)組的?是從0開(kāi)始的,列也是從0開(kāi)始的,例如:int arr[3][3]={1,2,3,4,5,6,7,8,9,10};
示意圖:
行/列 | 0 | 1 | 2 |
---|---|---|---|
0 | 1 | 2 | 3 |
1 | 4 | 5 | 6 |
2 | 7 | 8 | 9 |
(2) 輸入
分別循環(huán)輸入行和列,思路大致和輸入一維數(shù)組相同。
int main()
{
int arr[3][3] = {0};
int i = 0;
for (i = 0; i < 3; i++)//輸入行
{
int j = 0;
for (j = 0; j < 3; j++)//輸入列
{
scanf("%d", &arr[i][j]);
}
}
return 0;
}
(3) 輸出
輸出自然也與一維數(shù)組大致相同,利用循環(huán)依次輸出。
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 3; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");//輸出一行后換行
}
return 0;
}
3.3 二維數(shù)組的存儲(chǔ)
(1) 數(shù)組名
二維數(shù)組的數(shù)組名也是一個(gè)地址,那和一維數(shù)組的數(shù)組名有何不同呢,其實(shí)二維數(shù)組的數(shù)組名表示的是第一行的地址,但可能大家還是有下面的疑惑:
int main()
{
int arr[3][3] = { 0 };
printf("%p,%p\n", arr,&arr[0][0]);
return 0;
}
為什么明明二維數(shù)組名代表的是第一行的地址,那么為什么和第一個(gè)元素的地址相同呢,其實(shí)和字符串的存儲(chǔ)一樣,如果將所有地址表示出來(lái),太浪費(fèi)內(nèi)存,而數(shù)組在內(nèi)存中是連續(xù)存儲(chǔ)的,所以找到首元素的地址,就能找到一行中所有元素的地址。所以就以首元素地址代表第一行的地址。
(2) 二維數(shù)組元素的存儲(chǔ)
像?維數(shù)組?樣,我們?nèi)绻胙芯?維數(shù)組在內(nèi)存中的存儲(chǔ)?式,我們也是可以打印出數(shù)組所有元素的地址的。代碼如下:
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 3; j++)
{
printf("arr[%d][%d]=%p ",i,j, &arr[i][j]);
}
printf("\n");//輸出一行后換行
}
return 0;
}
? 輸出如下:
通過(guò)對(duì)上面地址的觀察,我們知道二維數(shù)組也是在內(nèi)存中連續(xù)存儲(chǔ)的,并且arr[0][2]和arr[1][0]的地址之間也差4個(gè)字節(jié)(byte),所以?xún)?nèi)存存儲(chǔ)如下:
arr | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
下標(biāo) | 0,0 | 0,1 | 0,2 | 1,0 | 1,1 | 1,2 | 2,0 | 2,1 | 2,2 |
3.4 二維數(shù)組例題
題目:輸入六個(gè)數(shù)到2行3列的二維數(shù)組arr中, 將二維數(shù)組arr1中的數(shù)組元素轉(zhuǎn)置,即行列互換,存儲(chǔ)到3行2列的二維數(shù)組arr2中,輸出二維數(shù)組arr2中的數(shù)組元素。
思路:就是循環(huán)輸入,在轉(zhuǎn)置(行與列交換),最后輸出。
代碼如下:
int main()
{
int arr1[2][3];
int arr2[3][2];
int i = 0;
int j = 0;
for (i = 0; i < 2; i++)
{
for (j = 0; j < 3; j++)
{
scanf("%d", & arr1[i][j]);
}
}
for (i = 0; i < 2; i++)
{
for (j = 0; j < 3; j++)
{
arr2[j][i] = arr1[i][j];//轉(zhuǎn)置
}
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 2; j++)
{
printf("%d ", arr2[i][j]);
}
printf("\n");
}
return 0;
}
4. 變長(zhǎng)數(shù)組
4.1概 念
在C99標(biāo)準(zhǔn)之前,C語(yǔ)?在創(chuàng)建數(shù)組的時(shí)候,數(shù)組??的指定只能使?常量、常量表達(dá)式,或者如果我們初始化數(shù)據(jù)的話,可以省略數(shù)組??。
例如:
int arr1[10];
char arr2[4];
int arr3[] = {1,2,3};
- 但是這樣的語(yǔ)法限制,讓我們創(chuàng)建數(shù)組就不夠靈活,有時(shí)候數(shù)組?了浪費(fèi)空間,有時(shí)候數(shù)組??了不夠?,所以在C99中給?個(gè)變?數(shù)組(variable-length array,簡(jiǎn)稱(chēng)VLA)的新特性,允許我們可以使?變量指定數(shù)組??。
4.2用法
例如:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-837846.html
int n;
scanf("%d",&n);
int arr1[n];
- 變?數(shù)組的根本特征,就是數(shù)組?度只有運(yùn)?時(shí)才能確定,所以變?數(shù)組不能初始化。
到了這里,關(guān)于探秘C語(yǔ)言數(shù)組:解鎖高效數(shù)據(jù)管理與多維空間編程技巧"的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!