C++中的多维数组其实就是数组的数组,二维数组指的就是数组的元素也是数组。
(1)初始化
二维数组的初始化方式有如下几种:
1 int ia[3][4] = {{0,1,2,3}, {4,5,6,7}, {8,9,10,11}}; 2 int ia1[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11}; 3 int ia2[3][4] = {{1},{3},{6}};//只初始化了每一行的第一个元素 4 int ia3[3][4] = {0, 3, 6, 9}//只初始化了第一行的元素
对于第3行所显示的初始化方式,剩下的元素的初始化规则同一维数组的初始化方式,即内置类型的初始化为0,类类型的调用默认构造函数进行初始化。
(2)指针和多维数组
如果表达式只提供了多维数组的一个下标,那么获取的元素是该行下标索引的内层数组,如ia[2]获取的是ia数组的第三行,而非数组中的任何元素。
因为多维数组其实就是数组的数组,所有由多维数组转换而成的指针类型应是指向第一个内层数组的指针,如:
1 int ia[3][4]; 2 int (*ip)[4] = ia;//ip points to an array of 4 ints 3 ip = &ia[2];
注意,下面的两个声明是不同的:
1 int *ip[4];//array of pointers to int 2 int (*ip)[4];//pointer to an array of 4 ints
其区别类似于函数指针与函数声明,可以通过typedef更直观的定义:
1 typedef int int_array[4]; 2 int_array* ip = ia;
利用指针遍历二维数组如下:
1 int ia[3][4] = {{2},{4},{5}}; 2 typedef int int_array[4]; 3 for(int_array* p = ia; p != ia+3; p++) 4 { 5 for(int* q = *p;q != *p+4;q++) 6 cout<<*q<<endl; 7 }
上面的代码中外层的for循环中p初始化为指向ia的第一个内层数组,每移动一次就指向下一行的内层数组,内存for循环中,对p进行解引用获得的是一个有4个int型元素的数组,通常,系统会自动将它转换为指向该数组第一个元素的指针。