【概念】
1、数组中的独立变量:索引变量,下标变量或元素
2、方括号中的数字:索引或下标
3、数组的索引变量数目:声明长度或数组长度
4、索引编号从0开始,结束于数组长度-1的整数
5、索引变量可以为任意类型,但同一数组的所有索引变量必然是同一类型(基类型)
6、方括号中的索引可以是整数常量,如int a[10];也可以是表达式(求值结果在0和数组长度-1之间),如int n=2;score[n+1]=10;
【声明】
声明数组时,数组长度可以使用已定义的常量
const int NUM=10;int score[NUM];//注意:数组长度不能使用变量!!部分编译器不兼容
【内存表示】
1、数组各索引变量的位置在内存中相邻;
2、计算机仅记住索引变量a[0]的地址,通过元素的基类型占用的内存空间来计算其他索引变量的地址。
3、常见错误是引用不存在的数组索引,导致内存溢出;
【初始化】
int num[3]={4,21,55};//提供的值少于数组长度,剩余索引变量默认初始化为数组基类型的零值(建议主动初始化)。
【遍历】
int arr[]={3,5,9,14};
for(int x:arr){
cout<<x<<endl;
}
for(auto x:arr){
cout<<x<<endl;
}
【函数参数】
1、索引变量作为函数参数时,用法和普通变量一样;
2、整个数组作为函数参数时,需在形参中指明数组长度(只有数组首个索引变量的地址和基类型被传递),此时数组实参自动退化为同类型指针。
int getSize(int data[],int size);//size为数组长度,data[5]内的索引数字会被编译器忽略
//以下为数组退化为指针演示
int getSize(int data[]){return sizeof(data);}
int data[] = {1,2,3,4,5};
cout<<sizeof(data)<<endl;//输出20
cout<<getSize(data)<<endl;//输出8,64位系统下指针长度为8字节
注意:
1、实际调用函数时,提供的实参data不添加[]或索引表达式,如getSize(data,5);
2、数组形参为传引用参数的弱型,作用于数组形参的任何操作都会作用于数组实参
3、常量数组参数用const修饰(通常只修饰数组形参和类形参),数组任何值都不能被修改int getSize(const int data[],int size);
【常用算法】
1、顺序搜索
2、选择排序
3、冒泡排序(较大值如同气泡上浮,连续向数组末尾移动)
【二维数组】
二维数组可以转换为对应的二维显示,第一个索引代表行,第二个索引代表列。
int getSize(int data[][3],int size);
注意:
1、二维数组作为参数传递时,不指定第1维长度(索引数组被编译器忽略),size用于标识第1维长度
2、第1维(甚至更多维)是用于描述基类型,而基类型长度必须被指出!
【动态数组要点】
1、写代码时不指定数组长度,在运行时确定长度
2、数组变量本质是指针变量,指向数组的第一个索引变量
3、数组标识符a可视为指针变量,且指针值不可修改!!
int a[5];int *p=addr;a=p;//非法!!
【动态数组声明&销毁】
int *p=new int[3];//通过new操作符创建
1、动态数组指针的指针类型和数组元素的指针类型是相同的
2、动态数组长度在[]中指出,如果缺失则由系统分配足够大的存储空间
3、delete []p;//销毁动态数组所在的堆内存空间