最近有不少同學詢問大雄有關數組的相關問題,相信學過C語言的同學都知道數組的重要性,今天就來給大家分享一下它的使用方法,乾貨較多,建議收藏觀看哦。
一、數組
1、數組的基本概念
數組:類型相同的數據元素的集合,是C語言中的一種構造數據類型,這些元素會順序地儲存在內存的某段區域。
2、數組的特點
(1)數組是一種引用類型數據,存放在內存中。
(2)數組當中存放多個數據(元素),類型必須統一。
(如果定義的是int類型,那麼裡面的所有元素都必須是int類型)
(3)數組的長度在運行當中不允許改變。
(定義的數組元素個數在運行的過程當中不允許改變)
3、數組定義語法
數組類型 數組名[數組大小]
(1)數組大小:決定了數組中能夠存放的元素數量。
(2)數組大小不能是變量,只能是字面值或字面值表達式。
(3)C語言編譯器要求在編譯期間就需要確定數組的內存大小。
(4)數組大小必須是大於0的正整數。
二、一維數組
1、一維數組的創建和初始化
(1)一維數組的創建
數組的創建方式:
數組創建的實例:
註:數組創建, [] 中要給一個常量才可以,不能使用變量。可以直接用常量,或者使用宏定義。
(2)一維數組的初始化
數組的初始化是指,在創建數組的同時給數組的內容一些合理初始值(初始化)。
1)全部初始化
初始化列表:用大括號括起來的,用於對數組進行初始化的一個值的列表,每個值之間通過逗號隔開。
初始化列表只能在定義數組時使用,數組定義完成後不能再使用初始化列表給數組賦值。
全部初始化要求初始化列表中各元素個數必須與數組大小相同。
2)部分元素附初值
實際開發中,通常採用部分元素賦初值的方法對數組元素進行初始化,如:int arr[100]={0};
3)省略長度賦初值
定義數組時,如果後面跟有初始化列表,並且初始化列表中的值的個數就是預期的數組大小,則可省略括號中的數組大小。
4)在內存中的存儲
2、一維數組的使用
[ ] ,下標引用操作符。它其實就數組訪問的操作符。我們來看代碼:
注意:
(1)sizeof()操作符用於取長度,以字節為單位。sizeof(數組名)即求的時整個數組的大小。sizeof(首元素)即求數組單個元素大小。用0下標,是因為數組至少存在一個有效元素,所以0下標永遠存在。
(2)數組是使用下標來訪問的,下標是從0開始。
(3)數組的大小可以通過計算得到。建議採用sizeof(arr)/sizeof(arr[0])這種方式。
3、一維數組在內存中的存儲
看代碼:
輸出結果如下:
仔細觀察輸出的結果,可知隨著數組下標的增長,元素的地址,也在有規律的遞增。
由此可以得出結論:數組在內存中是連續存放的。
總結:
(1)數組在內存中開闢是線性連續且遞增的。
(2)在c語言中,任何變量(基本變量,指針變量,結構體變量,數組變量)的空間都是整體開闢,但任何元素的起始地址一定是開闢字節當中最小的。
三、二維數組
1、二維數組的創建和初始化
(1)二維數組的創建
二維數組創建時,行數可以忽略不寫。並且所有維度的數組其第一個方括號的內容可忽略。
(2)二維數組的初始化
1)全部初始化
順序全部賦初值
2)部分初始化
按行部分賦初值
順序部分賦初值
3)省略長度初始化
可省略長度,不可省略列數。
按行:
按列:
2、二維數組的使用
二維數組的使用也是通過下標的方式,用雙重循環嵌套進行索引使用。看代碼:
3、二維數組在內存中的存儲
像一維數組一樣,這裡我們嘗試列印二維數組的每個元素。
輸出結果為:
通過結果我們可以分析到,其實二維數組在內存中也是連續存儲的。
總結:
(1)二維數組在內存的空間布局上,也是線性連續且遞增的。
(2)二維數組本質上也是一維數組,只不過內部元素放的是一維數組。
四、數組作為函數參數
①調用函數傳參數組時,減少函數傳數組時的成本問題(時間和空間)。因為傳參時,需要臨時拷貝,如果數組過大,可能會浪費資源,嚴重的話可能棧溢出。
②數組元素降維成指向數組內部元素類型的指針。
③對指針加一,加上所指向的類型的大小。
1、一維數組
看代碼:
畫圖解析:
總結:
(1)形參格式,例如int arr[ ]或者int *arr,兩者等價。
(2)形參元素個數可被忽略,並且建議忽略(有可能改變了實參的大小,這樣比較方便)。或者也可以填寫比實參元素個數大的值。
(3)用sizeof()求數組元素個數時,儘量在數組定義時求。因為傳參後數組會降維成指針。
2、二維數組
前面說了數組元素降維成指向數組內部元素類型的指針,二維int整型數組的內部元素不再是int整型,而是具有四個整型的一維數組。
對指針加一,加上所指向的類型的大小。對二維數組的指針加一,加上的值為內部一維數組的大小。
看代碼:
畫圖解析:
形參格式,例如:int arr[][4]或者int (*arr)[4],這裡為指向具有四個整型元素的一維數組的數組指針。
除了第一個中括號里的數字可以省,後面的中括號的內容不能省略,因為下標是數組類型的一部分,省略掉就不明確其類型。
注意:
看待所有的數組時,都將它看作一維數組,只不過其內部元素不一樣,例如:三維數組其內部元素為二維數組,而二維數組也是由一維數組組成,都是線性連續且相等的。
五、數組指針和指針數組
①數組指針:是指針,指向數組。例:int (*arr)[10]
②指針數組:是數組,數組內容存放的是指針。例:int *arr[10]
然後,需要明確一個優先級順序:()>[]>*
所以:
(*p)[n]:根據優先級,先看括號內,則p是一個指針,這個指針指向一個一維數組,數組長度為n,這是「數組的指針」,即數組指針;
*p[n]:根據優先級,先看[],則p是一個數組,再結合*,這個數組的元素是指針類型,共n個元素,這是「指針的數組」,即指針數組。
1、指針數組
看代碼:
輸出結果:
首先,對於語句int*p[4],因為[ ]的優先級要比*要高,所以 p 先與[ ]結合,構成一個數組的定義,數組名為 p,而int*修飾的是數組的內容,即數組的每個元素。
也就是說,該數組包含 4 個指向int類型數據的指針,如圖所示,因此,它是一個指針數組。
2、數組指針
看代碼:
結果為:
其次,對於語句int(*arr)[4],「( )」的優先級比[ ]高,*號和 arr 構成一個指針的定義,指針變量名為arr,而int 修飾的是數組的內容,即數組的每個元素。
也就是說,arr 是一個指針,它指向一個包含 4 個int類型數據的數組,如圖 所示。很顯然,它是一個數組指針。
分享到這裡就結束了,希望能夠給你帶來幫助,如果有想要了解學習的內容也可以私信或者留言,說不定哪天就等來了呢~