簡體   English   中英

C編程 - 在使用多維數組的函數中使用的指針

[英]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中的函數不能返回數組...

真的對這些指針感到困惑......

為什么數組( transc )聲明為靜態? 據我所知,當你用靜態聲明一個變量或一個函數時,它不能被導入以便在另一個文件中使用,但這在某種情況下並非如此......

這兩個函數都試圖返回指向數組的指針。 兩者都做錯了 ,無法在我的系統上編譯。

除非它是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] -但他們搞砸了鑄造cdouble *在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

注意,函數有希望工作的唯一原因(一旦類型問題被理順), transc都被聲明為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM