用数组指针创建三围数组

finalangelx 2015-04-28 05:46:22
前些日子有个单子制作个二维数组的Map[X][Y];
于是乎自己开始倒腾下代码。结果发现,真的3年不写代码,这些都还给老师了。

后来百度到一篇文章是“三维数组指针”的。还出自CSDN,百度置顶了。
http://bbs.csdn.net/topics/250056494
就稀里糊涂的把代码复制到工程里试了试,崩溃的一塌糊涂。。。

好吧,我复制的是5楼的代码。

后来自己研究了下,发现蹊跷的地方了。

首先拿一维指针来说,就是普通的 指针。

我们也拿int来做例子。
int *p;
p = new int;√
p = new int[100];√
以上两种方案都是对的,一个是指向 int的内存地址,一个是指向 int 数组的地址 ,两个都是对的。

接下里二维数组

int **p;
p = new int[5];//或者学习之前文章里的 p = (int**)new int[5];也行
for(int i = 0; i < 5; i++)
{
p[i] = new int[10];
}

这个代码看起来有没问题?
认真分析下。p[i] = new int[10]; 那么这个p[i] 是什么东西?思考下就会知道 p[i] 是个 int *;不然,他怎么能指向一个数组。
反过来推论,p = new int[5];是错误的,因为 如果 new int[5],那么 p[i] = int;是一个存储空间。而 int = int[10] 这本身就是个错误。

所以正确的应该是
int **p;
p = new int*[5];//ps:注意 new (int*)[10]和new int*[5] 是有区别的。

for(int i = 0; i < 5; i++)
{
p[i] = new int[10];
}

如果 之前的 p = new int[5]这个该怎么理解?但是有的时候可以运行成功是为什么?
这就是说你创建了 int数组,而int刚刚好,与指针类型所占的内存空间一样。刚好形成了转换。
如果你不是创建int数组,你创建的是 Struct[5],你看看会是个什么结果。。。
p[0]----[int][int][int][int][int][int][int][int][int][int][int]
p[1]----[int][int][int][int][int][int][int][int][int][int][int]
p[2]----[int][int][int][int][int][int][int][int][int][int][int]
p[3]----[int][int][int][int][int][int][int][int][int][int][int]
p[4]----[int][int][int][int][int][int][int][int][int][int][int]
上面这个就是大致的二维数组的 闹补图了。。。大致就是如此吧。
三维数组还没说?
好吧,我觉得可以抄袭之前那个文章里的代码了,主要就是 new的对象记得修改成对应 数组指针就好了。
...全文
566 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

32,946

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧