和一维数组类似,C++ 将二维数组名解释为其第一个元素的地址,而二维数组的第一个元素为一维数组,以下面的程序为例,二维数组名 array2d 和 &array2d[0] 等效,它们的类型都为 short (*)[5];对数组名应用地址运算符时,得到的是整个数组的地址,它的类型为 short (*)[5][5],假设 short 宽 2 字节,系统为 32 位,数组首地址为0x00BCF8FC,例子中几种表示的区别为:
- 数组名 array2d 和 &array2d[0] 等效,类型都为 short (*)[5],存储的是一个 10 字节内存块的地址,它们指向的对象是包含 5 个元素的 short 数组,但在运用 sizeof() 时,这两者会有区别,sizeof(array2d)=50 而 sizeof(&array2d[0])=4。
- 表示 &array2d 的类型为 short (*)[5][5],存储的是一个 50 字节内存块的地址,它指向的对象是 5 行 5 列的二维 short 数组。
- 表示 &array2d[0][0] 和 array2d[0] 等效,类型都为 short *,存储的是一个 2 字节内存块的地址,它指向的对象是 short 类型数据,但在运用 sizeof() 时,这两者会有区别,sizeof(&array2d[0][0])=4 而 sizeof(array2d[0])=10。
- 类型 short **,存储的是一个 4 字节内存块的地址,它指向的对象是 short* 类型数据。
[code]//声明并初始化数组short array2d[5][5] = {{5,2,8,4,1}, {2,2,4,6,8}, {1,5,8,9,4}, {5,7,6,2,5}, {7,6,5,8,1}};//声明并初始化指针一:以下几种赋值结果对ptra等效short (*ptra)[5] = array2d; //方式一:值为0x00BCF8FCshort (*ptra)[5] = &array2d[0]; //方式二:值为0x00BCF8FC//声明并初始化指针二short (*ptrb)[5][5] = &array2d; //值为0x00BCF8FC//声明并初始化指针三:以下几种赋值结果对ptrc等效short *ptrc = &array2d[0][0]; //方式一:值为0x00BCF8FCshort *ptrc = array2d[0]; //方式二:值为0x00BCF8FC//声明并初始化指针四:以下几种赋值结果对ptrd等效short *ptrTmp[5] = {array2d[0],array2d[1],array2d[2],array2d[3],array2d[4]};short** ptrd = ptrTmp; //方式一:值为0x00BCF8A4short** ptrd = new short*[5]{ array2d[0], array2d[1], array2d[2], array2d[3], array2d[4]}; //方式二:值为0x01156470,需配合使用delete[]释放内存short** ptrd = new short*[5]();ptrd[0] = array2d[0];ptrd[1] = array2d[1];ptrd[2] = array2d[2];ptrd[3] = array2d[3];ptrd[4] = array2d[4]; //方式三:值为0x01046AE0,需配合使用delete[]释放内存//访问数组第3行第4列的元素cout |