這兩個函數都試圖返回指針數組。兩者都是這樣做是錯誤的並且無法在我的系統上編譯。
除了當它是sizeof
或一元&
運營商的操作數,或是使用在聲明初始化字符數組文本字符串,類型「的T
N元件陣列」的表達將被轉換(「衰減」)轉換爲類型爲「指向T
的指針」的表達式,並且表達式的值將是該數組的第一個元素的地址。
在transpose
函數中,我們返回表達式trans
。 trans
具有類型「012-的100-元素陣列」,其中T
是「100-元素陣列double
」。它不是sizeof
或一元&
操作符的操作數,所以它被轉換(「衰減」)爲「指向T
」類型的表達式,在這種情況下,它是「指向100個元素的數組double
」(double (*)[100]
) ,不是「指向double
的指針的指針」,(double **
)。
編譯器應該抱怨那個函數。礦確實,像這樣:
gcc -c -std=c99 -pedantic-errors -Wall transpose.c
transpose.c: In function âtransposeâ:
transpose.c:7: error: return from incompatible pointer type
在matrixMultiply
功能,c
具有類型「的double
10元件陣列的10個元素的陣列」,其中「衰減」到「指針至10個元素的數組的double
」 (double (*)[10]
)。第二個函數具有正確的返回類型 - double (*)[10]
- 但他們搞砸了由return語句鑄造c
到double *
,我們得到了相同的錯誤面前:
gcc -c -std=c99 -pedantic-errors -Wall matrixMultiply.c
matrixMultiply.c: In function âmatrixMultiplyâ:
matrixMultiply.c:11: error: return from incompatible pointer type
他們應剛纔寫的
return c;
和一切都會好起來的。
來讀取第二函數定義的方法如下:
matrixMultiply -- matrixMultiply
matrixMultiply( ) -- is a function taking
matrixMultiply(/* some params */) -- some parameters (omitted for brevity)
*matrixMultiply(/* some params */) -- returning a pointer
(*matrixMultiply(/* some params */))[10] -- to a 10-element array
double(*matrixMultiply(/* some params */))[10] -- of double
注意,唯一的原因要麼功能有工作(一旦類型問題理順了)的一個希望是,無論trans
和c
被宣佈爲static
,這意味着它們的生命週期遍及整個程序,而不僅僅是它們各自功能的生命週期。沒有那個static
關鍵字,他們在它們的封閉函數返回後不再存在,那些指針將變爲無效。
這不一定是好的做法 - 這些功能不再是可重入的,也不是線程安全的。最好將目標數組作爲參數傳遞給函數,但請注意,指向10元素數組的指針與指向11元素數組的指針是不同的,不兼容的類型 - 如果必須處理數組不同數量的列,這可能會變得棘手。沃拉斯可以與幫助:
void transpose(int r, int c, double arr[r][c], double trans[c][r])
{
...
}
假設你有VLAS可用(你應該對C99和C2011系統,雖然他們已經在C2011已經取得可選)。如果你不......這會變得更加困難。
'double **'是**不是**二維數組,並且不能指向一個。指針不是數組。不,你不能將數組傳遞給函數。但是你可以傳遞指向數組的指針。 – Olaf