下面隨筆給出C++數組的存儲與初始化的細節內容。
數組的存儲與初始化
一維數組的存儲
數組元素在內存中順次存放,它們的地址是連續的。元素間物理地址上的相鄰,對應着邏輯次序上的相鄰。
例如:
一維數組的初始化
在定義數組時給出數組元素的初始值。
-
列出全部元素的初始值
例如:static int a[10]={0,1,2,3,4,5,6,7,8,9};
-
可以只給一部分元素賦初值
例如:static int a[10]={0,1,2,3,4};
-
在對全部數組元素賦初值時,可以不指定數組長度
例如:static int a[]={0,1,2,3,4,5,6,7,8,9}
二維數組的存儲
-
按行存放
例如: float a[3][4];
可以理解為:
其中數組a的存儲順序為:
a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23
二維數組的初始化
-
將所有初值寫在一個{}內,按順序初始化
-
例如:static int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12
-
-
分行列出二維數組元素的初值
-
例如:static int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
-
-
可以只對部分元素初始化
-
例如:static int a[3][4]={{1},{0,6},{0,0,11}};
-
-
列出全部初始值時,第1維下標個數可以省略
-
例如:static int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
-
或:static int a[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
-
注意:
-
如果不作任何初始化,內部auto型數組中會存在垃圾數據,static數組中的數據默認初始化為0;
-
如果只對部分元素初始化,剩下的未顯式初始化的元素,將自動被初始化為零;
-
現在我們來看一個用數組存放Fibonacci數列的例子。
例: 求Fibonacci數列的前20項
1 #include <iostream> 2 3 using namespace std; 4 5 int main() { 6 7 int f[20] = {1,1}; //初始化第0、1個數 8 9 for (int i = 2; i < 20; i++) //求第2~19個數 10 11 f[i] = f[i - 2] + f[i - 1]; 12 13 for (int i=0;i<20;i++) { //輸出,每行5個數 14 15 if (i % 5 == 0) cout << endl; 16 17 cout.width(12); //設置輸出寬度為12 18 19 cout << f[i]; 20 21 } 22 23 return 0; 24 25 }
運行結果:
例:循環從鍵盤讀入若干組選擇題答案,計算並輸出每組答案的正確率,直到輸入ctrl+z為止。
1 每組連續輸入5個答案,每個答案可以是'a'..'d'。 2 3 例: 一維數組應用舉例 4 5 #include <iostream> 6 7 using namespace std; 8 9 int main() { 10 11 const char key[ ] = {'a','c','b','a','d'}; 12 13 const int NUM_QUES = 5; 14 15 char c; 16 17 int ques = 0, numCorrect = 0; 18 19 cout << "Enter the " << NUM_QUES << " question tests:" << endl; 20 21 while(cin.get(c)) { 22 23 if(c != '\n') { 24 25 if(c == key[ques]) { 26 27 numCorrect++; cout << " "; 28 29 } else 30 31 cout<<"*"; 32 33 ques++; 34 35 } else { 36 37 cout << " Score " << static_cast<float>(numCorrect)/NUM_QUES*100 << "%"; 38 39 ques = 0; numCorrect = 0; cout << endl; 40 41 } 42 43 } 44 45 return 0; 46 47 }