從本章開始,就進入了c語言的高階篇.前面講的都是c語言最基本的知識.
本章將講解陣列.陣列就是在乙個變數名下存放多個資料的儲存區的說明,是具有相同型別的資料的集合按照一定的順序組成的資料.在處理大量資料的時候,使用陣列十分的方便.
陣列和其他型別的變數一樣,必須要先定義後使用.
前面講過,c語言中的資料型別可以分為基本型別,構造型別,指標型別和空型別,本章介紹的陣列屬於構造型別.
本章及後面的章節將主要介紹:一位陣列,二維陣列和字元陣列(由於字元陣列比較特殊,放在後面的章節專門講)
不過c語言其實是支援高維陣列的.
本章主要內容有:
在許多數學問題中,進場遇到數列和矩陣的概念.
數列和矩陣是用於描述一批資料之間的關係的.因此c語言使用陣列來表達數列和矩陣,陣列和數列,矩陣的關係如下圖:例如:數列x:x1,x2,x3,x4
矩陣y:y11,y12,y13,y14
y21,y22,y23,y24
矩陣和數列都有相同的特點:
正如前面所屬的,陣列也具有和矩陣及數列相同的特性:
為了方便處理這些相同型別的資料,c語言使用陣列來儲存這些變數.
c語言在編譯的時候會根據宣告的陣列大小來在記憶體中開闢一系列連續的空間作為陣列的儲存位址,
因此在宣告陣列的時候需要指定陣列的大小
並且,宣告陣列的大小不可以用變數,因為記憶體分配在程式執行之前,故此時變數都只剛剛被劃分記憶體空間而沒有具體數值.
因此陣列宣告的一般形式是:
型別說明符 陣列名 [常量表示式]……;
不同維度的陣列宣告下面將詳細介紹
本節將講述一維陣列的定義,引用和初始化.
由於一維陣列是c語言中處理大量資料的首選,因此必須要掌握.
一維陣列的定義方式:
型別說明 陣列名[常量表示式]
;
其中:
例如:
int age[10]
;
關於一維陣列需要說明的點如下:
一維陣列的初始化,分成兩種,分別和變數的初始化對應.
第一種是在陣列宣告時候就初始化
第二種是在陣列宣告之後才初始化
下面將分類介紹
陣列宣告時初始化
陣列宣告時初始化就是指在宣告陣列的時候就為陣列內的元素賦值.語法如下
型別符 陣列名[元素個數]
=;
例如:
int a[5]
=;
需要說明的點如下:
錯誤的宣告例子如下:
float a[2]
,a=2.0
;/*不能重名*/
char s;
/*不賦值的時候不能省略長度*/
int n=
3,m[n]
;/*陣列的長度必須是常量或者常量表示式,不能是變數*/
陣列宣告後初始化
陣列宣告後的初始化其實與陣列元素的引用密切相關
因此將結合後面一維陣列的引用介紹,這裡只是說明,對於陣列的初始化具有以上兩種方法
陣列必須要先定義,後引用.在定義了陣列之後,陣列的引用格式如下:
陣列名[下標表示式]
陣列元素實際上就是一種變數,他和一般的變數在運用上沒有不同.可以列印,賦值,等等.
但是c預言不允許一次引用整個陣列,因此我們常用迴圈的形式來遍歷陣列.
所以陣列宣告後的初始化其實就是引用元素後賦值,例如:
int a[5]
;a[2]
=2;>>
>a[2]=0;
但是關於一維陣列的應引用還有說明的點.
主要就是關於記憶體中的位址的問題,這點在後面的指標中很有幫助.
我們實際上宣告乙個變數的時候只是在記憶體中劃分了區域,而賦值的時候則是將快取中的值存到劃分的區域中.
因此由於陣列是乙個結構型資料,因此無法像基礎變數型別一樣可以直接得到整個陣列的位址.
但是由於陣列的本質是多個相同型別資料的集合,因此我們實際上可以通過取陣列中元素的記憶體位址進而獲得陣列的位址.
取陣列元素位址的操作如下:
陣列元素的位址:陣列名[i]或陣列名+i
陣列首位址(實際上是陣列第乙個元素的位址)
:陣列名或&陣列名[
0]
例如:
int x[5]
;x //取元素的首位址
&x[0
]//取元素的首位址
x+i //取陣列的x[i]元素的位址
&x[i]
//取陣列的x[i]元素的位址
二維陣列相比於一維陣列多了乙個維度的擴充套件,因此在實際上具有更廣泛的運用.
例如:灰度影象的儲存,聲音頻號的儲存(時間和強度兩個維度),以及數學上的矩陣等等.
下面就將介紹二維以及高維陣列的定義,初始化和引用(主要介紹二維,高維則加以推廣)
二維陣列定義的一般形式如下:
型別符 陣列名[行數]
[列數]
在記憶體中的儲存形式如下:
同樣,高維陣列的宣告如下:
型別符 陣列名[維度1長度]
[維度2長度]..
..[維度n長度]
在記憶體中的儲存按照維度從前到後的順序進行,遍歷儲存是從後到前
例如二維陣列是先儲存a[0][x],在a[1][x],最後是a[2][x].遍歷則是x從0到3
和一維陣列的初始化一樣,二維陣列的初始化也分為宣告時初始化和宣告後初始化.
陣列宣告時初始化
有以下兩種方式:
型別符 陣列名[行數]
[列數]=;
型別符 陣列名[行數]
[列數]=,
}
其中第二中的可讀性更高.
需要說明的點如下:
陣列宣告後初始化
其實就是對二維陣列引用之後賦值,略
二維陣列的也需要先定義後引用.引用語法如下:
陣列名[行下標]
[列下標]
關於二維陣列的記憶體位址相關說明如下:
元素首位址: 陣列名或陣列名[
0]或陣列名[0]
[0]元素i行首位址: 陣列名[i]或陣列名+i
元素位址:
&陣列名[i]
[j]或&陣列名[i]
+j
例如:
a[m]
[n]/*陣列a的m行n列對應元素的位址*/
a,a[0]
,&a[0]
[0]/*陣列a首位址*/
a[i]
,a+i /*二維陣列第i行陣列元素的首位址*/
&a[i]
[j],x[i]
+j /*二維陣列元素a[i][j]的位址*/
用
二維陣列的也需要先定義後引用.引用語法如下:
陣列名[行下標]
[列下標]
關於二維陣列的記憶體位址相關說明如下:
元素首位址: 陣列名或陣列名[
0]或陣列名[0]
[0]元素i行首位址: 陣列名[i]或陣列名+i
元素位址:
&陣列名[i]
[j]或&陣列名[i]
+j
例如:
a[m]
[n]/*陣列a的m行n列對應元素的位址*/
a,a[0]
,&a[0]
[0]/*陣列a首位址*/
a[i]
,a+i /*二維陣列第i行陣列元素的首位址*/
&a[i]
[j],x[i]
+j /*二維陣列元素a[i][j]的位址*/
第六章 「另類」陣列
動態陣列與字串常量可算是兩種 另類 陣列。vla可變長陣列並不為c89所支援,c99才開始支援vla。但如果想在只支援c89的編譯環境中使用vla的話,怎麼辦呢?我們可以用動態陣列來 模擬 動態陣列在矩陣的運算中很常見,常用來向函式傳遞乙個大小可變的矩陣。動態陣列的原理,是利用一塊或多塊動態分配的記...
第六章 「另類」陣列
動態陣列與字串常量可算是兩種 另類 陣列。vla可變長陣列並不為c89所支援,c99才開始支援vla。但如果想在只支援c89的編譯環境中使用vla的話,怎麼辦呢?我們可以用動態陣列來 模擬 動態陣列在矩陣的運算中很常見,常用來向函式傳遞乙個大小可變的矩陣。動態陣列的原理,是利用一塊或多塊動態分配的記...
第六章 「另類」陣列
動態陣列與字串常量可算是兩種 另類 陣列。vla可變長陣列並不為c89所支援,c99才開始支援vla。但如果想在只支援c89的編譯環境中使用vla的話,怎麼辦呢?我們可以用動態陣列來 模擬 動態陣列在矩陣的運算中很常見,常用來向函式傳遞乙個大小可變的矩陣。動態陣列的原理,是利用一塊或多塊動態分配的記...