Dragon  
Dragon
日历
<2008年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910
统计
  • 随笔 - 58
  • 文章 - 0
  • 评论 - 55
  • 引用 - 0

导航

常用链接

留言簿(3)

随笔分类(58)

随笔档案(58)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 
动态创建的二维数组与二维数组:
先看看以下代码,是动太创建一个二维数组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
可以看出行里也是连续储存的!

总结:
动态创建的二维数组的行与行之间的地址是不连续的,行里元素的地址是连续的!
而静态创建的二维数组的行与行之间的地址是连续的,行里元素的地址也是连续的!
所以用地址自增或地址+标号访问元素时要小心!
posted on 2008-12-12 23:26 Dragon 阅读(689) 评论(0)  编辑 收藏 引用 所属分类: C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


 
Copyright © Dragon Powered by: 博客园 模板提供:沪江博客