香港海港城购物便宜吗:c++中的一个小问题

来源:百度文库 编辑:神马品牌网 时间:2024/04/30 03:05:32
# include <iostream.h>
void main()
{
int c[2][3][2]={{{5,4},{3}},{{2},{1,0}}};
for(int i=0;i<12;i++)
cout<<c[0][0][i]<<" ";
}
输出结果为5 4 3 0 0 0 2 0 1 0 0 0
居然可以这样输出数组的各元素?!

C++中的多位数组就是展开了的一维数组
或者说是数组的数组
不知道我这么说你能不能理解:

int c[2][3][2];
这句话,实际上c是个三级指针常量,即:
const int*** c;
而c[0][0]就是一个指向数组头的指针,
所以c[0][0][0]是第一个元素,c[0][0][1]是第二个元素……

用二维数组可能更好说
假设一个二维数组a[2][2]是一个2*2的矩阵:
[1 2
3 4]
C++中数组的储存是按行展开
所以这个矩阵存起来实际上是一个以维数组
[1 2 3 4]
a是一个二级指针常量,指向一个指向1的指针
a[0]是这个矩阵的第一行,所以a[0]实际上是一个一维数组,数组头指向1
a[1]是这个矩阵的第二行,所以a[1]实际上是一个一维数组,数组头指向3
所以用a[0]这个数组(实际上是指针常量)就可以遍历整个矩阵
a[0][0]..a[0][3]

还有不明白请提出,我qq226527085

在各种程序设计语言中,数组的内存空间都是连续的,在内存访问时,是以数组的首指针开始计算数组元素的地址差来引用数组元素的。
由于数组的空间连续,那么访问“超界”的数组元素如果没有超过整个数组的界限,就会访问到对应的下一组数据,如果超过界限,就会访问到后面定义的变量或者造成非法操作。
原则上说,应当避免对多维数组进行这样的处理,因为C语言并没有规定数组在机内的储存方法,那么各种编译器就有可能按他自己的方式存储。(在目前来看,仅仅是可能,没有任何一个编译器这样做,其实只要编译器自己找得到,乱序存储也没关系的)