作者cerberus1226 (超‧废柴大叔)
看板C_and_CPP
标题Re: [问题] 三维阵列
时间Thu Feb 19 21:30:48 2009
※ 引述《Hermite (Simple Life)》之铭言:
: 我有个三维阵列 red[600][320][240]
: 然後要将这个阵列传给副程式int fun();
: 我写成
: fun(red);
: int fun( int *** red)
: 可是学长说我这样写不对,得要在阵列前加上&
: int fun(int *** &red)
: 但是跑出来的结果都是相同的,是巧合吗?
: 我想问这种写法两个有什麽差别呢?
int fun( int red )
int fun( int &red )
这两个跑出来的内容完全一样绝对不是巧合
int a = 1;
int b = a;
int &c = a;
这两行的差别在於,c是a的参考,而b只是复制a的值而已
即b = 2; c = 3; 後
a 的值为3
同理可知
int red1 = p;
int *** &red2 = p;
这两行不管你取的 i, j, k 值为何
red1[i][j][k] 必等於 red2[i][j][k]
因为他们取到的是同一块记忆体位址的内容
red1 指向的位址同 p
red2 即 p
=> red1 指向的位址同 red2
这二者的差别有两点
一、会不会影响到原本的值
二、传递的方法(一个为值的复制、一个是参考的传递)
所以如果当Type的复制很耗时的时候,两者会在效率上有较大的差别
当然,此情况下後者效率较佳
至於说要 int fun( int red[600][320][240] ) 才会过
其实应该是 int fun( int red[][320][240] ) 就会过了
参数值放阵列的方法是 Type array[];
int red[][320][240] 其实就是 (int[320][240]) red[] 的意思
至於如果因为检查型态过不了的话,你大可以强制转型
如 (int ***)a 之类的,但如果转错型的话程式也不能用就是了
编译会过和结果会对本来就是两回事
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.46.192.118
1F:→ softwind:你传array给func的话 就和传pointer "一样" 了 02/19 21:36
2F:推 zlw:受教了 02/19 22:04