2010-12-10 183 views
4

我知道這是一個古老的栗子,但我想要一個靜態分配在我的代碼中的小二維數組。我知道這樣做的方法是:C中的二維數組初始化

static int A[3][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 } }; 

這很好,我可以訪問它的所有成員。但是我有幾個問題,把它傳遞給一個函數,例如:

void print_matrix(int **a, int r, int c) 
{ 
    int x, y; 

    for(x = 0; x < r; x++) 
    { 
     printf("Row %02d = %#x = ", x, a[x]); 

     for(y = 0; y < c; y++) 
     { 
      printf("%s%d", (0 == y) ? "" : ", ", a[x][y]); 
     } 
     printf("\n"); 
    } 
} 

首先,我不能簡單地傳遞A的功能,我需要將其轉換爲(INT **)。由於char *char []是同義詞,所以我對此有點驚訝。其次,它崩潰,當我檢查調試器時,在子函數中,a[0]報告爲1,而不是指向整數數組的指針。

我知道這裏發生了編譯器/ C語言奧術魔法。但它有點令人困惑。如果我嘗試初始化爲:

static int *A[3] = { { 1, 2 }, { 3, 4 }, { 5, 6 } }; 

我收到很多警告。這是如何的不同而不同:

static char *S[3] = { "hello", "there", "stackoverflow" }; 

除了奧術魔法ç的問題,這在某種程度上我從來儘管在C語言編程的十年:(,我想學會懂得我的生成數組這樣我就可以順利通過它作爲一個int **而不必通過的for循環所有FAG或複製靜態分配的數組動態分配一個。

將在下面的工作?

int *A0 = { 1, 2 }; 
int *A1 = { 3, 4 }; 
int *A2 = { 5, 6 }; 
int **A = { A0, A1, A2 }; 

有沒有比這更好的方法呢?

謝謝,所有。

P.s.我知道在現實生活中,我們會從數據庫或文件中讀取數值到動態分配的數組中,並避免所有這些。

+4

這驗證碼的東西提交問題很爛!第一個字母有兩個字母重疊,第二個字母全部模糊,完全不可讀!我做了音頻挑戰,幾乎聽不到第二部分。 – AlastairG 2010-12-10 14:12:59

回答

9

一個多維數組不會成爲一個多級指針(我不知道適當的術語)。只有一個維度衰減。例如:

int [20]變成int *; int [20][5]變成int (*)[5](它不是int **);等等。

如果有很大的願望使用多維數組(通過[r][c]語法),那麼你必須通過其他邊界(它必須是常量)。如果需要可變邊界,我認爲最好的選擇是手動執行索引轉換(即不是a[r][c],請使用a[r*C + c])。

+2

在C99中,可以像這樣定義函數:「void f(int c,int a [] [c])...」或「void f(int c,int(* a)[c]).. 「。在此之後,您可以像任何其他多維數組一樣索引數組。 – tiftik 2010-12-10 15:06:21

3

我會從諮詢this question in the C FAQ開始,然後是entire section

+3

嗯,我希望有一兩句話能清楚地描述答案,而不必通過參考文獻的頁面。儘管如此,他們仍然是後代的很好的參考,所以謝謝。 – AlastairG 2010-12-10 14:36:38

1

最快的方法是聲明參數aint a[][2]

void print_matrix(int[][2] a, int r, int c); 

// and call the function like this: 
print_matrix(A, 3, 2); 
+0

不起作用。不管怎麼說,還是要謝謝你。 – AlastairG 2010-12-10 14:32:14

+0

這是c,所以'void print_matrix(int a [] [2],)''。 – lijie 2010-12-10 15:23:57

0
static char *S[3] = { "hello". "there", "stackoverflow" }; 
          // ^~~~~~ This is a period. 
+0

但是你*看過完整的問題嗎? :-) – Eiko 2010-12-10 14:35:47

+0

已修復,但僅僅發現錯字沒有意義。 – AlastairG 2010-12-10 14:40:15

2
int A0[2] = { 1, 2 }; 
int A1[2] = { 3, 4 }; 
int A2[2] = { 5, 6 }; 
int *A[3] = { A0, A1, A2 }; 

你是密切與最後一節,但無需略有不同的聲明。得到的A可以作爲int **傳遞給函數。

有了這個,print_matrix(A, 3, 2);輸出:

Row 00 = 0x5eaeda70 = 1, 2 
Row 01 = 0x5eaeda68 = 3, 4 
Row 02 = 0x5eaeda60 = 5, 6