目录
数组的存储与初始化
一维数组的存储
数组元素在内存中顺次存放,它们的地址是连续的。元素间物理地址上的相邻,对应着逻辑次序上的相邻。
例如:
一维数组的初始化
在定义数组时给出数组元素的初始值。
-
列出全部元素的初始值
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];
可以理解为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JqCLiPKA-1594979262981)(C:\Users\qbzxb\AppData\Roaming\Typora\typora-user-images\image-20200715190630718.png)]
其中数组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}};
注意:
- 如果不作任何初始化,块作用域中的局部数组中会存在垃圾数据,
static
数组中的数据默认初始化为0; - 如果只对部分元素初始化,剩下的未显式初始化的元素,将自动被初始化为零;
数组作为函数的参数
- 数组元素做实参,与单个变量一样。
- 数组名作参数,形、实参都应是数组名,类型要一样,传递的是数组的首地址。对形参数组的改变,会直接影响到是实参数组。
注意:数组作为形参时弱化成为指针
示例:使用数组名组函数参数
#include <iostream>
using namespace std;
void rowSum(int a[][4],int 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 << endl;
}
rowSum(table,3); // 调用子函数,计算各行和
// 输出计算结果
for(int i = 0; i < 3; i++)
cout << "Sum of row " << i << table[i][0] << endl;
return 0;
}
对象数组
对象数组的定义和访问
-
定义对象数组
类名 数组名[元素个数];
-
访问对象数组元素——通过下标访问
数组名[下标].成员名
对象数组的初始化
-
数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。
-
通过初始化列表赋值。
Point a[2]={ Point(1,2),Point(3,4)};
-
如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用默认构造函数)。
数组元素所属类的构造函数
-
<