数组的学习告一段落,但正所谓温故而知新,阶段性总结对巩固记忆及加深掌握很有帮助,所以还是要总结一波数组的要点。
首先数组的特性是内存连续,类型相同,它的类型基本涵盖c++大部分类型,其数组名既是内存首地址又是数组标识符,而长度表达式要求是常量,这在形参作表达式时很关键。
int arr[1];
数组的访问可通过下标形式与指针形式进行,数组名可作为常指针使用,由于数组名是内存首地址,对元素的访问可以通过*(数组名+下标)获取
Cout<<arr<<endl;
指针数组的数组名则是个二级指针,元素是指针,而指向数组的指针数组内的元素则是指向数组的指针,这时数组名与指针的区别就出来了
int * arr1[1] ={ arr };
int(*arr2[1])[1]= { &arr };
二维数组名是指向数组的指针数组,与指向数组的指针数组的概念相似, 但指向数组的指针数组的数组名为指向数组的二级指针,而二维数组名是指向数组的指针。
int arr3[1][1];
int(*arr2[1])[1] = {arr3 };
int(**arr4[1])[1]= { arr2 };
这点在作为函数传递与动态创建二维数组时很容易看出来:
int **p = new int *[a];
for (int i = 0;i < a; i++) {
p[i] = new int[a];
}
printf1(p, a);
void printf1(int**, int);
数组作为参数传递时形参接受的形式为声明一个数组,用数组名接收实参,而实际接受的值为地址,其作用方式同指针。
int a [ 4 ] ={ 1, 2, 3, 4 } ;
test(a,a);
void test ( int a[] , int*b )
{
cout << "sizeof ( a ) = " << sizeof ( a )<< endl ;
cout<< "sizeof ( b ) = "<< sizeof ( b ) << endl ;
}
而数组作为参数的方式与变量相同,数组名传递地址作为参数,也可以直接通过arr[]的方式进行传递。