新手关于二维数组的几点理解,大神可以走开。
二维数组简单的初始化
对于二维数组的常用定义(动态)
//已知 行、列
- A (*ga)[n] = new A[m][n];
- ...
- delete []ga;
- A** ga = new A*[m];
- for(int i = 0; i < m; i++)
- ga[i] = new A[n];
- ...
- for(int i = 0; i < m; i++)
- delete []ga[i];
- delete []ga;
但对于自定义数据类型呢 ,应用中是有很多这样的需求,
假设该类声明如下:
class CandySprite :public cocos2d::CCSprite{....}
因为数组中存放的是指针,所以
//我们可以预定义
typedefCandySprite *p_candySprite;
p_candySprite **candyArray =new p_candySprite*[11];
//一共10列
for(int i=0;i<11;i++){
bubbleArray[i] =new p_candySprite[10];
}
这样一个自定义数据类型的二维数组就生成。可以写成candyArray[i][j] = 指向candySprite的指针;
顺便提一下
void Func(int arr[5])
{
...
}
Func 函数的参数是: int arr[5]。 这是第一次接触使用数组作为参数。它表示在调用Func时,需要给这个函数一个大小为5的整型数组。
在这个参数里,我们没有看到“&”。似乎这应该是一个“传值”方式的参数,但错了,对数组作为参数,则固定是以传址方式将数组本身传给函数,而不是传数组的复制品。
为什么要有这样一个例外?首先是出于效率方面的考虑。复制数组需要的时间可能和复制一个简单变量没有区别:比如这个复制就只有一个元素: int arr[1]; 但如果这个数组是1000个,或50000个元素,则需要较长的时间,对于C,C++这门追求高效的语言,太不合算。
接着从第二点上说:“数组本身就是内存地址”,也正好说明了这一点,数组作为函数的参数,传的是“地址”,并且不需要加‘&’符号来标明它是一个传址方式的参数,因为,“数组本身就是内存地址”。