[英]C programming - pointers used in functions that work with multidimensional arrays
我有以下兩個功能:
double** transpose(double **a, int r, int c){
static double trans[100][100];
int i,j;
for(i = 0; i < r; i++)
for(j = 0; j < c; j++)
trans[j][i] = a[i][j];
return trans;
}
double(*matrixMultiply(double a[10][10], double b[10][10],
int rowA, int colB, int colARowB))[10]{
static double c[10][10];
int i, j, k;
for(i = 0; i < rowA; i++)
for(j = 0; j < colB; j++){
c[i][j] = 0;
for(k = 0; k < colARowB; k++)
c[i][j] += a[i][k]*b[k][j];
}
return (double*) c;
}
雖然我理解算法,有人可以解釋一下這兩個函數返回的內容(類型,指針......)? 第二個似乎返回一個數組,但我認為C中的函數不能返回數組...
真的對這些指針感到困惑......
為什么數組( trans
和c
)聲明為靜態? 據我所知,當你用靜態聲明一個變量或一個函數時,它不能被導入以便在另一個文件中使用,但這在某種情況下並非如此......
這兩個函數都試圖返回指向數組的指針。 兩者都做錯了 ,無法在我的系統上編譯。
除非它是sizeof
或一元&
運算符的操作數,或者是用於在聲明中初始化字符數組的字符串文字,否則將將“N元素數組T
”的表達式轉換為(“衰減”)到表達式“指向T
指針”,表達式的值將是數組的第一個元素的地址。
在transpose
函數中,我們返回表達式 trans
。 trans
具有類型“ T
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
具有類型“10元素數組的double
元素10元素”,其“衰減”為“指向double
元素的10元素數組”( double (*)[10]
)。 第二個函數具有正確的返回類型- double (*)[10]
-但他們搞砸了鑄造c
以double *
在return語句,我們得到了相同的錯誤面前:
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元素數組的指針是不同的不兼容類型 - 如果必須處理數組使用不同數量的列,這可能會變得棘手。 VLA可以幫助解決這個問題:
void transpose( int r, int c, double arr[r][c], double trans[c][r] )
{
...
}
假設您有可用的VLA(您應該在C99和C2011系統上,盡管它們在C2011中已經可選)。 如果你不這樣做......這會變得更難。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.