【数组】
数组的存储与初始化
- 一维数组的存储:数组元素在内存中顺次存放,地址是连续的。元素间地址上的相邻,对应着逻辑次序上的相邻。
- 如int a[10]; a:数组名字,数组名字是数组首元素的内存地址,数组名是一个常量(地址类型/指针类型的常量),不能被赋值。
- 一维数组的初始化:
①列出全部元素的初始值,此时可以不指定数组的长度。如:int a={1,2,3,4,5}
②可以只给一部分元素指定初值.
4.二维数组的存储:按行存放,可以理解为一维数组的数组。例:int a[3][4]; a[0]表示0行的首地址,a表示a[0][0]的地址,存储顺序:a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23.
5.二维数组的初始化:
①将所有初值写在一个{}内,按顺序初始化。
②分行列出二维数组元素的初值。例:int a[3][4]={(1,2,3,4),(5,6,7,8),(9,10,11,12)}
③只对部分元素初始化:要进行分组给出初始值(参照②)。
④当列出全部初始值时,第一维的坐标可省略。
二维数组的初始化:
如果不作任何初始化,局部作用域的非静态数组中会存在垃圾数据,static数组中的数据默认初始化为0
如果只对部分元素初始化,剩下的未显式初始化的元素,将会自动被初始化为0
例题
例1:用数组存放斐波那契数列
#include<iostream>
using namespace std;
int main()
{
int f[20]={1,1};//初始化第0、1个数
for(int i=2;i<20;i++)
f[i]=f[i-2]+f[i-1];//求第2~19个数
for(i=0;i<20;i++)//每行输出5个数
{
if(i%5==0) cout<<'\n';
cout.width(12);//设置输出宽度为12
cout<<f[i];
}
return 0;
}
例2:循环从键盘读入若干组选择题答案,计算并输出每组答案的正确率,直到输入ctrl+z为止,计算每组答案的正确率。
每组连续输入5个答案,每个答案可以是’a’…‘d’.
#include<iostream>
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<<"Enter the "<<NUM_QUES<<" questions tests."<<'\n';
while(cin.get(c))//get函数一次执行读取一个字母,将其赋给c
{
if(c!='\n')
{
if(c==key[ques])
{
numCorrct++;cout<<' ';
}
else
cout<<'*';
ques++;
}
else
{
cout<<"Score "<<static_cast<float>(numCorrct)/NUM_QUES*100<<"%";
ques=0;numCorrect=0;cout<<'\n';
}
return 0;
}
运行结果:
Enter the 5 questions :
acbbc
**Score 60%
数组作为函数参数
- 数组元素作实参,与单个变量一样。
- 数组名作参数,形、实参数都应是数组名,类型要一样,传送的是数组首地址,对形参数组的改变会直接影响到实参数组。
- 例题:使用数组名作为函数参数:主函数中初始化一个二维数组,表示一个矩阵,并将每个元素都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。
#include<iostream>
using namespace std;
void rowSum(int a[][4],int nRow)//行数不确定,有4列,所以要包含一个nRow
{
for(int i=0;i<nRow;i++)
for(int j=1;j<4;j++)
a[i][0]+=a[i][j];
}
int main()
{
int table[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
cout<<table[i][j]<<' ';
cout<<'\n';
}
rowSum(table,3);//用数组名table作实参,调用子函数,(将数组table的首地址传给了rowSum,求每一行的和
for(int i=0;i<3;i++)
cout<<"Sum of row "<<i<<" is "<<table[i][0]<<'\n';
return 0;
}
对象数组
1.定义对象数组:
类名 数组名[元素个数];
访问对象数组:
通过下标访问:数组名[下标].成员名
2.对象数组初始化
- 数组中每一元素对象被创建时,系统都会调用类构造函数初始化该对象。
- 通过初始化列表赋值。
例:Point a[2]={Point(1,2),Point(3,4)}; - 如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用默认构造函数)。
3.数组元素的构造和析构 - 构造数组时,元素所属的类未声明构造函数,则采用默认构造函数。
- 各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数。
- 个元素对象的初值要求为不同的值时,需要声明带形参的构造函数。
- 当数组中每一个对象被删除时,系统都要调用一次析构函数。