一文掌握C語言數組使用

老九學堂 發佈 2022-06-24T11:10:37.448836+00:00

最近有不少同學詢問大雄有關數組的相關問題,相信學過C語言的同學都知道數組的重要性,今天就來給大家分享一下它的使用方法,乾貨較多,建議收藏觀看哦。一、數組1、數組的基本概念數組:類型相同的數據元素的集合,是C語言中的一種構造數據類型,這些元素會順序地儲存在內存的某段區域。

最近有不少同學詢問大雄有關數組的相關問題,相信學過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類型數據的數組,如圖 所示。很顯然,它是一個數組指針。

分享到這裡就結束了,希望能夠給你帶來幫助,如果有想要了解學習的內容也可以私信或者留言,說不定哪天就等來了呢~

關鍵字: