作者ader888 (ㄚ德)
看板C_and_CPP
标题Re: [问题] 要如何动态配置2维阵列?
时间Tue Nov 14 20:14:13 2006
※ 引述《huangwh (香肠)》之铭言:
: ※ 引述《assyrian (喔耶)》之铭言:
: ------------------------------------------------
: : TYPE** array_2D = new TYPE*[n];
: : for(int i=0;i<n;i++){
: : array_2D[i]=new TYPE[n];
: : for(int j=0;j<n;j++){
: : ...
: : }
: : }
: -------------------------------------------------
: 不好意思
: 可以解释一下吗?
: TYPE** array_2D = new TYPE*[n];
: 谢谢
首先你要知道什麽指标。指标的「值」存的是记忆体的一个位置。所以在刚开始学
指标的时候常常可以看到这段code
int a=5;
int *b;
b=&a;
如此b的「值」是a在记忆体上的「位置」。如果我们输出*b就可以输出5,因为*是去
找指标所指到的那个位置(a在记忆体上的位置),然後把存在那个位置里的东西拿出来
再来说到动态宣告阵列(以下都以int为例,其他date type亦同),那你要先知道阵
列是怎麽搞的。若我们一维阵列宣告为
int array1D[10];
表示在记忆体上开了连续十个sizeof(int)的空间给了array1D,阵列的名称array1D
代表array1D在记忆体上开头的位置(也就是array1D == &array1D == &array1D[0])。
所以我们可以写
int *ptr1D;
ptr1D=array1D;
如此ptr1D的值就会是&array1D,我们也可以用ptr1D[2]来取array1D阵列里的值了。
再来是二维阵列的宣告,若我们宣告
int array2D[30][10]
表示在记忆体上开了连续30*10也就是300个sizeof(int)的空间给array2D,你可以把
二维阵列想像成很多个一维阵列叠在一起(三维阵列也可想像成很多二维阵列叠在一起)
。对row major的compiler或语言而言(C语言阵列宣告即是),array2D就像是30个
array1D;也就是array2D[i] 都相当於一个array1D,0≦i<20。
所以我们可以把二维阵列看成一个特别的一维阵列,这个一维阵列每一「格」存的都
是「一维阵列」。
/ □-----→□□□□□□□□□□ 想像十格(一个array1D)塞在一个「特殊的
| □-----→□□□□□□□□□□ 一维阵列的一格中。
| □-----→□□□□□□□□□□
| □-----→□□□□□□□□□□
30 □-----→□□□□□□□□□□
列 .
| .
| .
\ □-----→□□□□□□□□□□
所以若我们要宣告一个指标来指二维阵列的话,要指的是一个特殊的一维阵列。(一
维阵列要用int *指我们已经知道了)但是这个一维阵列里面的每一格又都是一个一维阵
列,所以现在我们要指的是int *,所以就用int **去指int * 。摁…好好体会一下= =
如果你array跟pointer的观念都很好了,那上面就可以不用看了= =。回到正题
: : int** array2Dptr = new int*[30];
: : for(int i=0;i<30;i++){
: : array2Dptr[i]=new int[10];
: : }
以下以动态宣告30*10的int阵列为例
因为是动态宣告,你并没有宣告,也就是没有在记忆体上有配置空间给你要开的阵列
,因此在宣告了int **array2Dptr之後,你要new出int*[30]的空间来让array2Dptr指,
也就是
array2Dptr
↘
/ □→
| □→
30 □→
| .
| .
\ □→
如图所示,你可以看到array2Dptr[i]都没有指到东西,因为你没有给他空间啊!!所以
需要for那段code帮每个array2Dptr[i] new出int[10]大小的空间,这样就会变成
array2Dptr
↘
/ □→□□□□□□□□□□
| □→□□□□□□□□□□
| □→□□□□□□□□□□
| □→□□□□□□□□□□
30 □→□□□□□□□□□□
列 .
| .
| .
\ □→□□□□□□□□□□
你就有空间可以用了啊!!!!
下台一鞠躬
初次po文请多包涵
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.166.48.211
1F:推 huangwh:谢谢唷!! 11/14 20:50
2F:→ ledia:推一个很清楚! 竟然这麽有闲可以画精美的图 Orz 11/15 01:41
3F:→ masterone:推~~好清楚喔!! 12/16 00:08
4F:推 shianhong:谢谢 受益良多 02/22 11:37
5F:推 zooping:推 受益良多 05/15 16:03
※ optimize:转录至看板 NTTU_CSIE99 11/21 13:01