簡體   English   中英

C中的2D陣列初始化

[英]2D array initialisation in C

我知道這是一個老栗子,但我想在我的代碼中靜態分配一個小的2D數組。 我知道這樣做的方法是:

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魔法的問題,盡管有十多年的C編程我不知道怎么回事:(我想知道如何生成我的數組,所以我可以成功地將它作為int **傳遞而不必去通過for循環的所有fag或將靜態分配的數組復制到動態分配的數組。

以下工作會怎樣?

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

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

謝謝,所有。

Ps我知道在現實生活中我們會將數據庫或文件中的值讀入動態分配的數組並避免所有這些。

多維數組不會成為多級指針(我不知道正確的術語)。 只有一個維度衰變。 例如:

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

如果非常希望使用多維數組(通過[r][c]語法),那么你必須傳遞其他邊界(必須是常量)。 如果需要變量邊界,我認為最好的選擇是手動執行索引轉換(即代替a[r][c] ,使用a[r*C + c] )。

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

我將首先在C FAQ中查閱此問題,然后是整個部分

最快的方法是將參數a聲明為int a[][2]

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

// and call the function like this:
print_matrix(A, 3, 2);
static char *S[3] = { "hello". "there", "stackoverflow" };
                          // ^~~~~~ This is a period.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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