學習C++ -> 一維數組
一、一維數組
數組是一些按序排列的同類數據元素的集合, 數組的用途可以暫時理解為用來一次定義大量變量, 例如我們要存放100個int型的整數, 如果我們一個個聲明就需要定義100個int型的變量, 例如:
int a1, b1, c1, d1, e1, f1, g1, ... ;
如此, 這樣是十分復雜且不符合實際的, 這時我們就需要借助一維數組來幫忙, 定義一個能夠放下100個int型整數的數組:
int a[100] ;
這樣就相當於完成了100個int型變量的定義, 確實很方便, 那么我們如何使用它呢? 我們可以這樣認為, 定義了一個int a[100]型的數組就相當於定義了:
int a[0], a[1], a[2], a[3], ..., a[99] ;
這時只需把a[0]、a[1]他們當做一個普通的變量名即可, 例如對其中的第一個數a[0], a[1]進行賦值操作:
a[0] = 10 ; a[1] = 20 ;
代碼演示:
#include<iostream> using namespace std ; int main() { int a[100] ; a[0] = 10 ; a[1] = 20 ; a[99] = 30 ; cout<< "a[0] = " << a[0] << endl ; cout<< "a[1] = " << a[1] << endl ; cout<< "a[99] = " << a[99] << endl ; return 0 ; }
輸出如下:
a[0] = 10 a[1] = 20 a[99] = 30 Process returned 0 (0x0) execution time : 0.047 s Press any key to continue.
可以看出, 定義了一個 int a[100] ; 那么從 a[0] 一直到 a[99] 都可以用來當做一個普通的變量名使用, 其中 中括號 [] 之間的數稱為數組的下標, 需要注意的是, 定義 a[100] 的一維數組他的下標范圍是 0-99, 因為下標是從0開始的, 不是從1開始, 從0開始到99正好是一百個數, 也就是說如果定義一個大小為100的一維數組 a[100] , 那么它能夠使用的下標范圍是 0 - 99, 如果使用時下標不在 0-99 這個范圍內就會發生不可預知的一些錯誤, 稱為 下標越界 , 當下標越界時編譯器是不會報錯的, 但是運行時會發生嚴重的錯誤, 所以一定要避免下標越界這種錯誤的發生。
1>. 一維數組的定義:
在上面的示例中已經定義了一個int型的數組, 數組的類型不但可以是int型, 他還可以是 unsigned int型、long int型、float型、double型等基本數據類型, 也可以是以后我們將會學習的自定義的數據類型, 一旦聲明了該數組的數據類型, 那么該數組中的所有元素都是聲明時的數據類型, 例如:
int a[100] ; //從 a[0] - a[99] 都是int型數據 float b[100] ; //從 b[0] - b[99] 都是float型數據 double c[100] ; //從 c[0] - c[99] 都是double型數據
數組定義的一般格式:
數據類型 數組名[元素個數] ;
元素個數的一般聲明方式:
①. 元素個數的定義可以直接指定一個整數值, 比如 int a[10], b[20] ; 這里的 10、20就是我們直接指定的該數組的大小(也稱為長度), 還可以包含些運算符來定義數組的大小, 如:
int a[10*6] ;
這樣就說明該數組的長度為60。
②. 元素個數還可以通過字符常量進行定義, 看一段代碼:
#define N 10 int main() { int a[N] ; return 0 ; }
在上面的代碼中我們定義了一個一維數組a, 並且指定了它的大小(長度)為10, 注意 #define N 10 這行代碼, 這句的意思就表示將字符 N 定義為 常量數值10, 在下面的代碼中, 出現 N 的地方就意味着將用數值10進行代替, 所以 int a[N] ;就相當於 int a[10] ;。
③. 在介紹這種聲明數組元素個數之前, 需要知道的是, 這種定義方式不適合所有的編譯器, 只有支持 C99 標准的編譯器才支持這種定義方式, 否則在編譯時會報錯, 這種聲明方式就是:
使用 一個值為整數的變量 去聲明一個數組的大小, 例如:
int n = 100 ; float a[n] ; //定義一個名為a, 大小為100的float型數組
2>. 一維數組的初始化:
數組的初始化是指在定義數組時, 同時對數組中的元素進行賦值的方法稱為數組的初始化。
初始化舉例:
int a[5] = { 1, 2, 3, 4, 5 } ;
這樣就是在定義時並且對數組進行初始化了, 其中 a[0]的中的值為1, a[1]中的值為2, ... a[4]中的值為5, 我們聲明了一個長度為5的數組a, 並且提供了5個初始值在大括號內, 中間用逗號隔開, 像這樣的方式就是對數組的中的元素個數全部全部初始化。
還可以對一個數組中的部分元素進行初始化:
int a[5] = { 1, 2, 3 } ;
這樣是只對數組的前三個元素, a[0]、a[1]、a[2]進行初始化, 沒有初始化到的部分默認以0填充, 此時 a[3]、a[4]中的值就是0。
數組初始化的一般格式:
①. 形式一:
數據類型 數組名[元素個數] = { 值1, 值2, 值3, ..., 值n } ;
對於這種形式, 沒有初始化到的部分將被賦上默認值0。
②. 形式二:
數據類型 數組名[] = { 值1, 值2, 值3, ..., 值n } ;
這種形式省略了數組元素個數的聲明, 編譯器會根據后面初始值的個數自動計算數組的長度, 例如:
int a[] = { 1, 2, 3, 4, 5 } ;
就相當於聲明一個數組a, 其長度為5, 並進行初始化。可以看出, 這種初始化的方式也可以用來聲明數組元素的個數。
需要注意的是, 如果不對數組進行任何初始化操作, 僅定義一個數組, 那么數組中這些元素的值是不確定的, 是系統中隨機的一個值。
3>. 一維數組的使用:
數組使用時需要指定下標的值, 一維數組的一般使用形式:
數組名[下標]
例如:
int a[10] = {} ; //定義並全部初始化為0 int i = 3 ; //定義一個普通整形變量, 初始值為3 a[1] = 10 ; //將數組a[1]賦值為10 a[1+1] = 20 ; //將數組a[2]賦值為20 a[i] = 30 ; //將數組a[3]賦值為30
下標必須是一個整數, 可以是常量、變量、表達式, 例如 a[1]、a[i]、a[i+1]這樣的使用都是合法的。
由於編譯器不做下標的越界檢查, 所以必須要注意下標的越界問題, 避免下標越界這樣的錯誤發生。
4>. 一維數組使用舉例:
輸入5個數並逆序輸出
輸入: 15 13 11 8 26
輸出: 26 8 11 13 15
輸入時每個數中間用空格隔開。
代碼:
#include<iostream> using namespace std ; int main() { int a[5] ; //定義一個元素個數為5的數組 int i ; //用於控制for循環 cout<< "Please input 5 numbers:" ; //提示輸入5個數 for( i = 0; i < 5; i++ ) //輸入 cin >> a[i] ; for( i = 4; i >=0; i-- ) //控制下標從4到0逆序輸出 cout << a[i] <<" " ; return 0 ; }
二、進一步理解
1>. 數組在內存中所占的空間大小
我們已經知道, 一個int型元素所占的內存為4字節(以較新的GCC編譯器為例), 那么如果定義一個 int a[10] ;這樣的數組在內存中將會占用多大的內存呢?
可以實際測量一下, 使用sizeof運算符,
#include<iostream> using namespace std ; int main() { int a[10] ; cout<<sizeof(a)<<endl ; return 0 ; }
輸出的結果為40, 也就代表是40個字節, 一個int型為4個字節, 數組的大小是10, 4 * 10正好是40, 如果不確定還可以從a[0]到a[9]一個個測量其占用的存儲單元大小, 然后相加, 這里就不再貼出代碼了。
總結下就是:
數組所占的內存單元大小 = 數組數據類型的大小 * 元素個數
例如 double b[10] ;所占的內存大小就是 一個double型數據大小8 * 元素個數 10, 即80個字節。
2>. 一維數組在內存中的存放狀態
一維數組在內存中實際上是一段連續的內存單元, 當定義好一個數組時, 一段連續的內存單元就被開辟出來用於存放數組中元素的值, 假如我們定義一個數組int a[10], 那么它在內存中的情況可以想象成如圖所示的狀態:
可以看到, 數組中的每個元素實際上都有一個自己的地址, 圖中的這些元素所對應的地址實際上全部都是為了方便表示而假設的, 數組在真實的運行中所使用的地址是根據當前系統的內存狀態而定, 所以說即時運行同一個程序, 每次運行時數組所使用的內存單元地址也極有可能不同。
從圖中還可以看到一點, 從a[0]到a[9]的內存地址不是 1000、1001、1002... 這樣連續的方式進行排列的, 而是 1000、1004、1008...這樣每隔4個數出現一個, 這樣的原因是因為一個int型是4個字節, 而一個存儲單元的大小為一字節, 所以一個int型數據就需要4個存儲單元, 也就是4個字節, 這里用一個方格表示一個元素是為了能夠直觀的進行表示。
在內存中的存放狀態這塊, 目前我們只需先對其有個相關的印象即可, 更詳細的介紹將會在以后將會學習的指針中進行。
--------------------
wid, 2012.12.03
上一篇: 學習C++ -> 循環語句與循環控制