下面随笔给出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); //设置输出宽度为1218 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 } else30 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 }