动态创建的二维数组与二维数组:
先看看以下代码,是动太创建一个二维数组a[3][4]
int **a;
a=new int*[3];
for(int i=0;i<3;i++)
{
a[i]=new int[4];
}
这是我调试时剪下来的图:
前面三行是每行的首地址,分别是&a[0],&a[1],&a[2]
&a[0][0]到&a[0][3]是第一行元素的地址
&a[1][0]到&a[1][3]是第二行元素的地址
0x00372680-0x00372628=0x00000058
0x003726d8-0x00372680=0x00000058
可见,第一行和第二行,第二行和第三行相隔88(0x00000058)个字节
可以看出行与行之间是不连续的!
再看行里的:
0x0037262c-0x00372628=0x00000004
0x00372630-0x0037262c=0x00000004
0x00372634-0x00372630=0x00000004
都是相隔4(0x00000004)个字节,在我的电脑里整型是占4个字节.
可以看出行里是连续储存的!
再看我这代码(以第一行为例):
int a[3][4];
调试时剪下来的图:
图的说明与前面一样:
0x0012ff60-0x0012ff50=0x00000010
0x0012ff70-0x0012ff60=0x00000010
可见,第一行和第二行,第二行和第三行相隔16(0x00000010)个字节
一行有4个整型元素,一个4字节,刚好是16字节.
可见行与行之间是连续的!
你还可以从&a[0][3]与&a[1][0]相隔的字节数看出来!
0x0012ff60-0x0012ff5c=0x00000004
刚好第一行未接下来就是第二行的开始!
再看行里的(以第一行为例):
0x0012ff54-0x0012ff50=0x00000004
0x0012ff58-0x0012ff54=0x00000004
0x0012ff5c-0x0012ff58=0x00000004
可以看出行里也是连续储存的!
总结:
动态创建的二维数组的行与行之间的地址是不连续的,行里元素的地址是连续的!而静态创建的二维数组的行与行之间的地址是连续的,行里元素的地址也是连续的!所以用地址自增或地址+标号访问元素时要小心!