每日一句:
傷害人的并非事件本身脸爱,而是他對(duì)事件的看法。
戴爾·卡耐基—《人性的弱點(diǎn)》
今日未妹,我們請(qǐng)來(lái)了一位老大簿废,別看他只是個(gè)人,他能裝的東西比你還要多呢络它。
老大的簡(jiǎn)介:
(array)是按順序儲(chǔ)存的一系列相同的值族檬,可以是10個(gè)char類型的字符或15個(gè)int類型的值。沒(méi)錯(cuò)化戳,這位老大便是數(shù)組导梆。這位老大還是有許多小弟的,這些小弟姓什么呢迂烁,有個(gè)專門的名字叫元素看尼。沒(méi)錯(cuò),整個(gè)數(shù)組有一個(gè)數(shù)組名盟步,通過(guò)整數(shù)下標(biāo)訪問(wèn)數(shù)組中單獨(dú)的項(xiàng)或元素(element)藏斩。
如何定義數(shù)組呢:
int?name[10];//說(shuō)明可存儲(chǔ)10個(gè)int類型整數(shù)的數(shù)組
char?name[10];//說(shuō)明可存儲(chǔ)10個(gè)字符的數(shù)組
老大介紹得差不多了,那么接下來(lái)便是介紹小弟(數(shù)組里的元素)了却盘。小弟可是很厲害的呢狰域,它可以是任意數(shù)據(jù)類型哦。
我們將用于識(shí)別數(shù)組元素的數(shù)字稱為下標(biāo)(subscript),索引(indice),或偏移量(offset)黄橘。需要注意的是下標(biāo)必須是整數(shù)哦兆览,下標(biāo)中的整數(shù)也代表了數(shù)組中有多少元素,而且要從0開(kāi)始計(jì)數(shù)塞关。下標(biāo)也是存在陷阱的抬探,因?yàn)榕掠绊懙綀?zhí)行的速度,C編譯器是不會(huì)檢查數(shù)組的下標(biāo)是否正確的哦。而且數(shù)組的元素是被依次存在內(nèi)存中相鄰的位置小压。
int?name[10];//元素為name[0]~name[9]
name[10]=55;//這個(gè)便是錯(cuò)的线梗,該數(shù)組元素不存在
注意:每個(gè)int為2字節(jié),char為1字節(jié)怠益。順便擴(kuò)展一下位仪搔、字,字節(jié)與KB的關(guān)系:
KB? 1KB=1024B
MB? 1MB=1024KB
GB? 1GB=1024MB
TB? 1TB=1024GB
int類型數(shù)組元素的用法和int類型變量的用法類似蜻牢,比如要讀取int類型變量name烤咧,應(yīng)該這樣寫
scanf("%d",&name);//讀取變量
scanf("%d",&name[n]);//讀取數(shù)組
昨天我們運(yùn)用了許多的for循環(huán),就有小伙伴跟我說(shuō)那么多for可以獨(dú)立出來(lái)寫么抢呆,獨(dú)立的for循環(huán)我個(gè)人不建議煮嫌。將for循環(huán)合并成一個(gè)循環(huán)可以使程序顯得更加緊湊,但我們也要遵循模塊化的原理镀娶。模塊化主要是把程序劃分為一些獨(dú)立的單元,每個(gè)單元執(zhí)行一個(gè)任務(wù)揪罕,這樣也能提高程序的可讀性梯码。更重要的是模塊化使程序的不同部分彼此獨(dú)立,方便以后對(duì)程序的修改好啰。
如何能更好的提高程序的可讀性呢轩娶?見(jiàn)下:
當(dāng)我們定義數(shù)組后,該如何賦值呢:
int name[5]={1,2,3,4,5};
int?name[5]={1,2,3,4};
我們認(rèn)真看就會(huì)發(fā)現(xiàn)第一行和第二行的差別框往,第一行將5個(gè)值賦給了name鳄抒,而第二行卻只有4個(gè)數(shù)值,那么還差一個(gè)怎么辦呢椰弊?不用怕许溅,編譯器會(huì)為它補(bǔ)上0的,但也只能補(bǔ)0哦秉版。
接下來(lái)我們就來(lái)更加詳細(xì)的介紹數(shù)組:
初始化數(shù)組
數(shù)組通常被用來(lái)存儲(chǔ)程序需要的數(shù)據(jù)贤重。比如一個(gè)內(nèi)含12個(gè)整數(shù)元素的數(shù)組就可以存儲(chǔ)12個(gè)月的天數(shù)。在這種情況下清焕,在程序一開(kāi)始就初始化數(shù)組比較好并蝗。大家知道什么是標(biāo)量變量么,簡(jiǎn)單說(shuō)就是只存儲(chǔ)單個(gè)值的變量秸妥。接下來(lái)我們來(lái)初始化這種變量:
float?flax=PI*2;/*PI已定義為宏*/
初始化數(shù)組:
int?main()
{int name[5]={1,2,3,4,5};
...}
如上所示滚停,我們用以逗號(hào)分隔的值列表(用花括號(hào)括起來(lái)的)來(lái)初始化數(shù)組,各值之間用逗號(hào)分隔粥惧,在逗號(hào)和值之間可以有空格键畴。上面的初始化是把1賦值給數(shù)組的首元素(即name[0])。
下面給大家展示一個(gè)簡(jiǎn)單的程序:
#include<stdio.h>
int main()
{?const?int?days[]={31,28,31,30,31,30,31,31,30,31};
int index;
for(index=0;index<sizeof?day/sizeof?days[0];index++)
printf("Month?%2d?has?%d?days.\n",index+1,days[index]);
return 0;
}
運(yùn)行結(jié)果如圖:
這里需要注意如下幾點(diǎn):
NO.1我們?cè)谏厦娉跏蓟瘮?shù)組時(shí)是省略了方括號(hào)中的數(shù)字突雪,編譯器會(huì)根據(jù)初始化列表中的項(xiàng)數(shù)來(lái)確定數(shù)組的大小镰吵。
NO.2 Sizeof運(yùn)算符給了它運(yùn)算對(duì)象的大虚莺獭(以字節(jié)為單位)。使用Sizeof days 是整個(gè)數(shù)組的大小疤祭,Sizeof day[0]是數(shù)組中元素的大小盼产。整個(gè)數(shù)組的大小除以單個(gè)元素的大小就是數(shù)組元素的個(gè)數(shù)。
指定初始化器
C99多了一個(gè)新特性:指定初始化器勺馆。利用該特性可以初始化指定的數(shù)組元素戏售。
例如可以在初始化列表中使用帶方括號(hào)的下標(biāo)指明待初始化的元素:
int?shu[6]={[5]=55};//把shu[5]初始化為55
一般來(lái)說(shuō),在初始化一個(gè)元素后草穆,沒(méi)有被初始化的元素都會(huì)被設(shè)置為0灌灾。以下面程序?yàn)槔?code>#include<stdio.h>#define?months 12
int main ()
{?int?days[months]={31,28,[4]=31,30,31,[1]=29};
int i;
for(i=0;i<months;i++)
{printf("%2d?%d\n",i+1,days[i]);}
return 0;
}
運(yùn)行如下:
該程序需要注意以下幾點(diǎn)(需要多多思考哦):
NO.1 如果指定初始化器后面有更多的值,如該例中的初始化列表中的片段:[4]=31,30,31,那么后面這些值將被用于初始化為30和31.
NO.2?如果再次初始化指定的元素悲柱,那么最后的初始化將會(huì)取代之前的初始化锋喜。比如上面的程序中初始化列表開(kāi)始時(shí)把days[1]初始化為28,豌鸡,但是days[1]又被后面的指定初始化[1]=29初始化為29.
NO.3?說(shuō)到如果沒(méi)有指定元素大小會(huì)怎樣呢嘿般?如下:
int?shu[]={1,[6]=2};//該數(shù)組有7個(gè)元素
int?shu[]={1,[6]=2,3};//該數(shù)組有8個(gè)元素
即:編譯器會(huì)把數(shù)組的大小設(shè)置為足夠裝得下初始化的值。
數(shù)組邊界
我們?cè)谑褂脭?shù)組時(shí)涯冠,要防止數(shù)組下標(biāo)越過(guò)邊界炉奴。簡(jiǎn)單來(lái)說(shuō)就是確保下標(biāo)是有效的值。比如:
int?you[20];
在使用該數(shù)組時(shí)蛇更,就需要注意在程序中使用的數(shù)組下標(biāo)在0~19的范圍內(nèi)瞻赶,況且編譯器不會(huì)檢查出這種錯(cuò)誤。前面也說(shuō)到過(guò)派任。
因此砸逊,使用越界的數(shù)組下標(biāo)會(huì)導(dǎo)致程序改變其他變量的值。不同的編譯器運(yùn)行該程序的結(jié)果可能也會(huì)不同哦掌逛,有的甚至?xí)?dǎo)致程序異常中止痹兜。
還要記住一點(diǎn)就是數(shù)組元素的編號(hào)是從0開(kāi)始的哦,最好是在聲明數(shù)組時(shí)使用符號(hào)常量來(lái)表示數(shù)組的大小颤诀。
數(shù)組下標(biāo)
C99標(biāo)準(zhǔn)允許了一種新型的聲明方式:
int?a1[n];//c99之前是不允許這樣的哦
這創(chuàng)建了一種新型數(shù)組字旭,稱為變長(zhǎng)數(shù)組。簡(jiǎn)稱VLA(C11放棄了這一舉措崖叫,把VLA設(shè)定為可選遗淳,而不是語(yǔ)言必備的特性)
C99引入變長(zhǎng)數(shù)組主要是為了讓C成為更好的數(shù)值計(jì)算語(yǔ)言。
注意:變長(zhǎng)數(shù)組是指用整型變量或表達(dá)式聲明或定義的數(shù)組心傀,而不是說(shuō)數(shù)組的長(zhǎng)度會(huì)隨時(shí)變化屈暗,變長(zhǎng)數(shù)組在其生存期內(nèi)的長(zhǎng)度同樣是固定的。
多維數(shù)組
上面把數(shù)組介紹得差不多了,那么下面就開(kāi)始介紹二維和多維數(shù)組养叛。我們可以把一維數(shù)組想象成一行數(shù)據(jù)种呐,把二維數(shù)組想象成數(shù)據(jù)表,把三維數(shù)組想象成一疊數(shù)據(jù)表弃甥。
現(xiàn)在用一個(gè)項(xiàng)目來(lái)講解二維數(shù)組:
如果有一個(gè)氣象員想要收集5年內(nèi)每個(gè)月的降水量數(shù)據(jù)爽室,那么他要如何表示數(shù)據(jù)呢?一個(gè)方案是創(chuàng)建60個(gè)變量淆攻,每個(gè)變量存儲(chǔ)一個(gè)數(shù)據(jù)項(xiàng)阔墩,顯然這個(gè)方法太麻煩。那么我們就可以用到二維數(shù)組來(lái)解決瓶珊,即創(chuàng)建一個(gè)主數(shù)組啸箫,主數(shù)組含有5個(gè)元素,每個(gè)元素是內(nèi)含12個(gè)元素的數(shù)組(每個(gè)元素表示一個(gè)月)伞芹。
聲明數(shù)組如下:
float?rain[5][12];
//內(nèi)含5個(gè)數(shù)組元素的數(shù)組忘苛,每個(gè)數(shù)組元素內(nèi)含12個(gè)float類型的元素
float?rain[5][12]? //顏色部分是指rain是一個(gè)內(nèi)含5個(gè)元素的數(shù)組;非顏色部分則是指一個(gè)含有12個(gè)float類型元素的數(shù)組唱较。
這說(shuō)明每個(gè)元素的類型都是float[12],簡(jiǎn)單說(shuō)也就是rain的每個(gè)元素本身都是一個(gè)內(nèi)含12個(gè)float類型值的數(shù)組扎唾。那么rain[0]是一個(gè)數(shù)組,它的首元素就是rain[0][0]绊汹,第二個(gè)便是rain[0][1],以此類推稽屏。
該項(xiàng)目代碼如下:
#include<stdio.h>
#define months 12//12個(gè)月
#define years 5//年數(shù)
int main()
{const?float?rain[years][months]={
{4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
{4.1,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
{4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
{4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
{4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
};//初始化時(shí)可省略內(nèi)部的花括號(hào)扮宠,只要保證初始化的數(shù)值個(gè)數(shù)正確
int?year,month;
float subtot,total;
printf("year????rainfall???(inches)\n");
for?(year=0,total=0;year<years;year++)//每一年西乖,各月的降水量總和
{?for(month=0,subtot=0;month<months;month++)
subtot+=rain[year][month];
printf("%5d?%15.1f\n",2015+year,subtot);
total+=subtot;} //5年的總降水量
printf("\nThe?yearly?average?is?%.1f inches.\n\n",total/years);
printf("monthly averages:\n\n");
printf("Jan?Feb?Mar?Apr?May?Jun?Jul?Aug?Sep?Oct");
printf("Nov Dec\n");
for(month=0;month<months;month++){
for(year=0,subtot=0;year<years;year++)
subtot+=rain[year][month];
printf("%4.1f",subtot/years);
}
printf("\n");
return 0;
}
運(yùn)行結(jié)果如下:
此程序計(jì)算了每年的總降水量,年平均降水量和月平均降水量坛增。
該程序使用了兩個(gè)嵌套for循環(huán)获雕,第一個(gè)是嵌套for循環(huán)的內(nèi)層循環(huán),在year不變的情況下收捣,遍歷month計(jì)算某年的總降水量届案;外層循環(huán)則改變year的值,重復(fù)遍歷month罢艾,計(jì)算五年的總降水量楣颠。
這里我們可以看到處理二維數(shù)組需要處理用到2重嵌套循環(huán),通常來(lái)說(shuō)咐蚯,處理三維數(shù)組需要用到3重嵌套循環(huán)童漩,四維則需要用到4重嵌套循環(huán)。
我們說(shuō)的二維數(shù)組的許多相關(guān)內(nèi)容都適用于三維或者多維數(shù)組春锋。比如聲明一個(gè)三維數(shù)組如下:
int name [3][3][3];
最后的話
相信你學(xué)到這里或多或少都對(duì)數(shù)組有了一定的了解矫膨,想要更好的理解數(shù)組,建議多看幾遍哦。這也是經(jīng)過(guò)多次閱讀書籍從而整理出來(lái)數(shù)組里最重要的一些知識(shí)點(diǎn)侧馅。希望大家看完這篇文章后對(duì)數(shù)組有更好的了解危尿。
讓它助你完成假期“超車”
一個(gè)正在學(xué)習(xí)C語(yǔ)言的人,致力于將C講得更透徹馁痴!
點(diǎn)贊關(guān)注~謝謝你~
長(zhǎng)按下圖二維碼關(guān)注谊娇,和你一起領(lǐng)悟程序員的魅力。