聲明
void func(double m[2][12],double n[2][3])
相當於
void func(double (*m)[12],double (*n)[3])
即第一陣列尺寸並不重要。頂層數組類型衰減爲指針類型,從而將2D數組參數聲明轉換爲指向1D數組的參數聲明。
此功能可與這些參數
double A[12];
double B[3]; /* note 3 instead of 6 */
正確的方式做被稱爲那就乾脆
func(&A, &B);
注意,不投是必要的,只是&
運營商的應用,給予A
和B
已經有適當的類型(在本例中爲double[12]
和double[3]
)。在這種情況下,只能訪問m[0][i]
和n[0][i]
,但不能訪問m[1][i]
或n[1][i]
,因爲這些不存在。
在你的例子中,代碼的作者採取了一些真正奇怪的步驟。
首先,顯然作者並沒有意識到第一個參數可以表示爲&A
,不需要強制轉換,因爲A
是用適當的類型聲明的。
其次,完全不清楚爲什麼B
被聲明爲大小爲6
的數組,當函數需要大小爲3
的數組時。爲了強制這個參數進入該函數,確實需要顯式強制轉換。
這兩個參數傳遞的方式只是一個錯誤代碼的例子。
作爲將一維數組成2D陣列......只要記住,在C和C++ T
類型的任何對象可以被解釋爲與T
類型的1個元素的一維數組。只需要將&
運算符應用於該對象。例如
int i = 0;
(&i)[0] = 5; /* access `&i` as `int[1]` array */
assert(i == 5);
如果所討論的對象本身就是一個數組,那麼可以做同樣的事情。例如,一維數組可以作爲一個二維數組與第一大小等於被訪問1
int a[10] = { 0 };
(&a)[0][8] = 42; /* access `&a` as an `int[1][10]` array */
assert(a[8] == 42);
這是在你的例子究竟發生了什麼,只是做了正確的方法是將&
操作向原目的。代碼的作者使用演員達到相同的效果。演員不是正確的做法。它不能保證工作,它恰好在實踐中具有相同的效果。
來源
2011-04-05 18:16:02
AnT
如果你正在使用C++並有權訪問C++ 0x我強烈建議使用std :: array。 – shuttle87 2011-04-05 18:41:46