一澄成、【掌握】數(shù)組簡介
思考:
蒼老師的班級里有5個學生暖哨,這次參加了語文考試,寫一個程序把這5個人的成績保存起來培慌,怎么做呢豁陆?
我們發(fā)現(xiàn),如果用一個變量來接收成績吵护,變量始終保存的是最后一次的輸入盒音。如果用5個變量來保存,代碼會比較多而且很不利于擴展馅而,萬一以后學生有500人呢祥诽?
所以,我們迫切地需要有一種變量瓮恭,能夠保存好多個不同的值雄坪。
這種變量,就叫數(shù)組屯蹦!
數(shù)組的定義格式:
數(shù)據(jù)類型 數(shù)組名[可以存儲的數(shù)據(jù)個數(shù)]
語義:數(shù)據(jù)類型給出了這個數(shù)組只能存什么類型的數(shù)據(jù)维哈,后面中括號[]里面填的是正整數(shù),表示這個數(shù)組可以存放多少個這種類型的數(shù)據(jù)
例:int arr[10]
代表這個數(shù)組只能存10個int類型的數(shù)據(jù)
其他類型的數(shù)組
char arr[5];
float arr[5];
double arr[5];
數(shù)組在內存中的存儲形式:(簡易形象版)
解釋:
1.先在內存中開辟一段空間
2.然后把這段空間N等份(如果你要存3個就劃分為3等份)
3.這3個小空間的類型根據(jù)你之前申明的類型確定
4.實際存數(shù)據(jù)的就是這些小空間
數(shù)組的三個專業(yè)術語:
1.元素:數(shù)組之中劃分的小空間里存的數(shù)據(jù)颇玷,就叫元素
2.下標/索引:為了區(qū)分每個小空間笨农,給每個小空間都從0開始,依次遞增1的做了編號帖渠,這個編號就叫做數(shù)組的下標/索引
3.長度:就是數(shù)組可以存儲多少個數(shù)據(jù)谒亦,一般在申明的時候就給出了長度,比如int arr[3]空郊,代表這個數(shù)組的長度為3份招,可以存放3個數(shù)據(jù)
數(shù)組的賦值與取值操作
1) 賦值:
因為數(shù)組中實際存儲數(shù)據(jù)的實際是內存中的每個小空間,所以應該是給小空間里賦值狞甚,那么數(shù)組里也許有多個小空間锁摔,怎么確定給哪個小空間賦值呢?通過下標來賦值
語法:
數(shù)組名[下標]
= 數(shù)據(jù)哼审;
例:
int arr[5];
arr[0]
= 10; //代表給數(shù)組中第一個元素賦值
注意:
賦值的時候谐腰,元素的下標千萬不要越界(即超過數(shù)組的小空間編號),編譯器不會報錯涩盾,但是實際使用時可能會出不可預知的錯誤
2)取值:
因為數(shù)組中的數(shù)據(jù)是存在每一個小空間里的十气,那么多小空間,我們到底要取哪一個呢春霍?所以這時也需要通過下標來確定
語法:
數(shù)組名[下標];
例:
int arr[3];
arr[0] = 10
int num
= arr[0]; //此時num的值為10
注意:
取值的時候下標也千萬不要越界砸西,否則也可能出現(xiàn)未知的錯誤
一般情況下,我們所說的數(shù)組都是指一位數(shù)組,即我們現(xiàn)在所學的這個數(shù)組芹枷。后面還會學習二維數(shù)組和了解一下多維數(shù)組衅疙。
二、【掌握】數(shù)組的詳細使用
1鸳慈、數(shù)組初始化的方法(賦值方法)
1)先定義數(shù)組饱溢,再賦值
例:
int arr[3];
arr[0] = 10;
arr[1] = 15;
arr[2] = 14;
解釋:因為數(shù)組中實際存儲數(shù)據(jù)的實際是內存中的每個小空間,所以應該是給小空間里賦值蝶涩,那么數(shù)組里也許有多個小空間理朋,怎么確定給哪個小空間賦值呢?就是通過數(shù)組的下標來賦值绿聘。所以上面的方法是給小空間一個一個地賦值
2)定義數(shù)組的同時初始化(賦值)
A、完全初始化
int nums[5] = { 1, 2, 3, 4, 5 };
B次舌、不完全初始化熄攘,沒有提供數(shù)據(jù)的默認初始化為 0
int nums[10] = { 1, 2, 3, 4, 5 };
C、省略數(shù)組長度彼念,由編譯器自動判斷
int nums[] = { 1, 2, 3, 4, 5 };
D挪圾、指定元素個數(shù),同時給指定元素進行初始化
int nums[5] = {[4] = 3,[1] = 2};
解釋:以上三種方法都是在數(shù)組申明時直接按順序給每個小空間賦值數(shù)據(jù)。
其他注意:不管是先定義數(shù)組逐沙,還是數(shù)組定義并初始化哲思。只要數(shù)組一經(jīng)定義,里面就有值吩案,里面默認的值都為0(如果是字符型數(shù)組棚赔,那么就是ascii碼中0所對應的字符'\0'即為空)
2、引用元素
什么叫引用元素:
引用數(shù)組元素表示使用數(shù)組中的每一個變量
用法:
使用下標引用數(shù)組中指定的變量
語法:
數(shù)組名[ 下標]
例如:
int nums[] = { 1, 2, 3 };
printf("%d\n",
nums[0]);
printf("%d\n",
nums[1]);
printf("%d\n",
nums[2]);
引用數(shù)組元素和使用指定類型變量一樣徘郭,可以讀取數(shù)據(jù)賦值等
1)讀取數(shù)據(jù)
2)獲取數(shù)據(jù)(打印靠益,計算)
3)自增等
3、遍歷數(shù)組元素
遍歷的意思:就是訪問每一個元素
使用 for 循環(huán)對數(shù)組進行遍歷
for
(int i = 0; i < length; i++) {
printf("%d\n",
nums[i] );
}
三残揉、【掌握】數(shù)組的越界
1胧后、數(shù)組的越界
生活中的越界
數(shù)組中的越界
越界訪問的情況:
新版本的xcode編譯不會報錯,運行中會報錯
總結:
一個長度為n的數(shù)組,最大下標為n-1,
下標范圍:0~n-1
精華:不要亂約別人的女朋友(訪問自己不該訪問的內存)抱环,否則后果很嚴重(運行異常)
【理解】數(shù)組練習
1壳快、蒼老師的班級里有10個學生,現(xiàn)要求輸入每個學生的成績镇草,算出總分是多少眶痰,平均值是多少,最高分和最低分
2陶夜、假設有數(shù)組int a[10] = {1,2,3,4,5,6,7,8,9,10}凛驮,按照從第一個元素到最后一個元素輸出(遍歷)元素值,然后再從最后一個元素到第一個元素輸出(遍歷)元素值
3条辟、讓用戶輸入數(shù)組的長度黔夭,然后再依次讓用戶輸入這個數(shù)組的每一個元素的值宏胯,最后再遍歷這個數(shù)組
4、在一個數(shù)組中查找指定元素第一次出現(xiàn)的下標本姥,如果沒有這個元素就打印-1
四肩袍、【掌握】數(shù)組作為函數(shù)的參數(shù)
思考:
如果有一個函數(shù),需要傳入一個int類型的參數(shù)婚惫,那么氛赐,
我們能不能把一個int類型的數(shù)組的元素傳過去呢?
答案是可以的先舷。
當有一個元素需要傳入基本類型(int,long,float,double,char等)的數(shù)據(jù)作為參數(shù)時艰管,
可以傳入同類型的數(shù)組的元素,如果類型不一致時會發(fā)生強制轉換蒋川。
因為數(shù)組的元素就相當于是某一類型的變量值牲芋。
1、數(shù)組元素作函數(shù)實參
數(shù)組元素就是下標變量,它與普通變量并無區(qū)別
捺球。
因此它作為函數(shù)實參使用與普通變量是完全相
同的,在發(fā)生函數(shù)調用時,把作為實參的數(shù)組元素的值傳送給形參,實現(xiàn)單向的值傳送缸浦。
思考&實現(xiàn)1:
判別一個整數(shù)數(shù)組中各元素的值,若大于0 則輸出該值,若小于 等于0則輸出0值(判斷過程使用函數(shù)實現(xiàn))
2、數(shù)組名作為函數(shù)參數(shù)
當函數(shù)的形參是一個數(shù)組時氮兵,那么我們的實參必須傳入一個數(shù)組(數(shù)組名)
注意:此時在函數(shù)內部改了某個元素的值裂逐,外部數(shù)組元素也會發(fā)生改
如下圖
這是為什么呢?
具體原因涉及到指針的概念泣栈,明天解釋卜高,今天大家只要知道當數(shù)組作為實參傳入函數(shù)時,在函數(shù)內部對數(shù)組元素進行修改秩霍,外部的數(shù)組也會收到影響篙悯!
思考:如果要寫一個函數(shù),函數(shù)的功能是將傳入的int類型數(shù)組中每個元素都加10铃绒,怎么做鸽照?
常規(guī)思考如下:
根據(jù)我們所學的內容會發(fā)現(xiàn):由于當數(shù)組作為函數(shù)形參時,外部可以傳入任意長度的數(shù)組颠悬,那么在函數(shù)內部中就不好處理了矮燎,循環(huán)次數(shù)寫大了會造成越界,寫小了會造成不能充分地操作每一個元素赔癌,那么怎么辦呢诞外?
解決之道:
一般當函數(shù)形參是一個數(shù)組時,還會再加一個參數(shù)用來傳入數(shù)組的長度灾票。
但是峡谊,這種方法需要程序員能完整記得自己定義這個數(shù)組時給的長度,這樣十分不科學。如果哪天定義數(shù)組后又寫了很長一段代碼才開始調用函數(shù)既们,這時程序員要回過頭找定義數(shù)組的長度很費時間濒析,那么有沒有一種方法幫我們解決呢?
解決之道:sizeof(數(shù)組名) / sizeof(類型)
例:int arr[3] = {1,2,3}; sizeof(arr) / sizeof(int)
解釋:由于數(shù)組是由多個同類型的小空間組成啥纸,所以只要先算出數(shù)組占用內存的總大小再除以每個空間占用的大小号杏,就可以得到有多少個小空間(元素)