首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求教 动态二维数组 跟 “二维数组的区别”

2012-10-23 
求教 动态二维数组 和 “二维数组的区别”“二维数组”,好像是数组的数组。就是在比如一个int a[3][3]这样的东

求教 动态二维数组 和 “二维数组的区别”
“二维数组”,好像是数组的数组。就是在比如一个int a[3][3]这样的东西
而也可以用int ** 然后继续分配

然而他们似乎有个很大的区别: 对于[][]的实现,第一种是直接在一维的基础上通过第一维的偏移量来寻址的,即第一个[]内的数乘以第二个[]内的长度 a[1][1] 即寻址到a+3*4+1*4

动态分配的就不细说了

虽说都是数组,但是似乎很不一样,谁能给我好好的讲讲?

[解决办法]
主要是寻址方式不同。看反汇编。

写代码的时候需要注意的是,不要搞混淆这两者就行了。
也就是说当作完全不同的类型就好。否则悲剧可能发生。
[解决办法]
它们的构建方式不同:链式数组要用循环语句来申请内存并且需要将第一维数组各单元指向第二维各个小数组;而普通二维数组就只是直接定义出来了事。

它们的存储方式不同:链式数组不能保证整个数组的存储空间是连续的,也就不可以简单地使用memset、memcpy之类的方式去清洗、复制;而二维数组就保证存储空间是连续的,可以使用那些语句去处理它。

它们的析构方式不同:链式数组需要分别将第二维和第一维的空间逐个释放,而普通二维数组就不必你去操心它。

它们的使用方式是同样的:链式数组:p[i][j];普通数组:arry[i][j]。尽管实际寻址方式并不相同,但看起来是一样的。

它们的效果是一样的:都能达到二维阵列式存储的效果。
[解决办法]
动态二维数组其实是个指针指向的某段堆空间,第二维长度可以不同。比如
const int len = 5;
int** p = new int*[len];
for( int i = 0; i < len; i++ )
{
p[i] = new int[i+1];
}
使用完毕需要释放否则内存侧漏

二维数组是保存在栈上,前提当然是如果你在函数里声明。使用完不用管,不过太大的话小心栈溢出
[解决办法]
归根结底,都是一维的。

热点排行