這個代碼有一個概念錯誤 - 數組表達式可能不是一個賦值的目標。如果試圖寫
void func1(void)
{
mat bbb;
bbb = aaa;
bbb[1][2] = 3;
}
編譯器將拋出的診斷上的表達bbb = aaa
(GCC「中分配不兼容的類型」診斷給出,因爲aaa
被轉換爲指針類型;低於更多)。通過傳遞bbb
到func2
你試圖做的事情實際上是同樣的事情,並且最終不會起作用。
讓我們擺脫了類型定義的,所以我們可以看到實際的類型涉及
double aaa[MAX_SIZE][MAX_SIZE];
...
void func2(double (*ccc)[MAX_SIZE])
{
ccc = aaa;
}
void func1()
{
double bbb[MAX_SIZE][MAX_SIZE];
func2(bbb);
bbb[1][2] = 3;
}
除非是sizeof
或一元&
運營商的操作數,或者是一個字符串用來初始化另一個陣列一個聲明,類型爲「T
的N元素數組」的表達式將被替換爲「指向T
」類型的表達式,其值是該數組的第一個元素的地址。當你調用func2
,表達bbb
從類型「MAX_SIZE
陣列MAX_SIZE
陣列的double
的」轉換爲「指針MAX_SIZE
陣列的double
」;因此ccc
的聲明爲double (*ccc)[MAX_SIZE]
。
類似地,在func2
線ccc = aaa
,表達aaa
從double [MAX_SIZE][MAX_SIZE]
類型轉換爲double (*)[MAX_SIZE]
。
到目前爲止,func2
是猶太教,因爲ccc
是一個指針表達式,而不是一個數組表達式,所以賦值是允許的。 ccc
也恰好是從bbb
(其接收到的指針值的副本bbb
計算結果爲)一個完全不同的實體,所以寫入ccc
對bbb
沒有影響。如果試圖通過傳遞指針來解決,要bbb
,像這樣:
void func2(double (*ccc)[MAX_SIZE][MAX_SIZE])
{
*ccc = aaa;
}
void func1(void)
{
double bbb[MAX_SIZE][MAX_SIZE];
func2(&bbb);
bbb[1][2] = 3;
}
編譯器會把這個診斷上*ccc = aaa
,或者是因爲*ccc
有數組類型,或者是因爲類型的*ccc
和aaa
不兼容(請記住,aaa
轉換爲指針表達式)。
將數組傳遞給函數作爲參數並不是一個好習慣。它們被作爲指針傳遞和長度(一個或多個)丟失 - 這讓你通過長度(一個或多個),也爲自變量(一個或多個)。 – Rolice 2012-01-05 19:21:35