用数组指针创建三围数组
前些日子有个单子制作个二维数组的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的对象记得修改成对应 数组指针就好了。