第6章 数组、指针与字符串(一) 6.1 数组的定义与初始化 6.1.1 数组的定义与使用
● 数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。 数组的定义
● 例如:int a[10];
表示a为整型数组,有10个元素:a[0]...a[9] ● 例如: int a[5][3];
表示a为整型二维数组,其中第一维有5个下标(0~4),第二维有3个下标(0~2),数组的元素个数为15,可以用于存放5行3列的整型数据表格。 数组的使用 ● 使用数组元素 必须先声明,后使用。
只能逐个引用数组元素,而不能一次引用整个数组 例如:a[0]=a[5]+a[7]-a[2*3] 例如:b[1][2]=a[2][3]/2 例6-1 数组的声明与使用 //例6_1 数组的声明与使用.cpp #include
int a[10], b[10];
for(int i = 0; i < 10; i++) { a[i] = i * 2 - 1;
b[10 - i - 1] = a[i]; }
}
for(int i = 0; i <10; i++) {//如果i=1;i<=10;i++会造成数组越界 cout << \ << i << \ << a[i] << \; cout << \ << i << \ << b[i] << endl; }
return 0;
运行结果:
6.1.2 数组的存储与初始化 一维数组的存储
数组元素在内存中顺次存放,它们的地址是连续的。元素间物理地址上的相邻,对应着逻辑次序上的相邻。 例如:
一维数组的初始化
在定义数组时给出数组元素的初始值。
● 列出全部元素的初始值
例如: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项 //例6_1_2 求Fibonacci数列的前20项.cpp #include
int main() {
int f[20] = {1,1}; //初始化第0、1个数
for (int i = 2; i < 20; i++) //求第2~19个数 f[i] = f[i - 2] + f[i - 1];
for (int i=0;i<20;i++) { //输出,每行5个数
if (i % 5 == 0) cout << endl; cout.width(12); //设置输出宽度为12
cout << f[i]; }
return 0; }
运行结果:
一维数组应用举例
循环从键盘读入若干组选择题答案,计算并输出每组答案的正确率,直到输入ctrl+z为止。 每组连续输入5个答案,每个答案可以是'a'..'d'。 例6-1-3: 一维数组应用举例 //例6_1_3 一维数组应用举例.cpp #include
using namespace std;
int main() {
const char key[ ] = {'a','c','b','a','d'}; const int NUM_QUES = 5; char c;
int ques = 0, numCorrect = 0;
cout << \ << NUM_QUES << \ << endl; while(cin.get(c)) { if(c != '\\n') {
if(c == key[ques]) {
numCorrect++; cout << \; } else
cout<<\; ques++; } else {
cout << \ << static_cast
ques = 0; numCorrect = 0; cout << endl; } }
return 0; }
运行结果:
6.1.3 数组作为函数参数
● 数组元素作实参,与单个变量一样。
● 数组名作参数,形、实参数都应是数组名(实质上是地址.关于地址详见6.2)。类型要—样,传送的是数组首地址,对形参数组的改变会直接影响到实参数组。 例6-2 使用数组名作为函数参数