1

本当の初心者の質問は間違いありませんが、私はこの振る舞いに頭を悩ませることはできません。2次元配列を初期化し、関数を呼び出して特定の値を出力します。プログラムと結果を以下に示します。

int
main(void)
{
    int matrix[3][5] = 
    {
        {14,7,6,55,2},
        {8,33,12,88,24},
        {19,20,21,90,7}
    };

    printArray(3, 5, matrix);

    printArray(2, 3, matrix);

    return 0;
}

void
printArray(int rows, int columns, int matrix[rows][columns])
{
    int i, j;



    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < columns; j++)
            printf("%3i ", matrix[i][j]);

        printf("\n");
    }   



    printf("\n");       
}



 14   7   6  55   2 
 8  33  12  88  24 
 19  20  21  90   7 

 14   7   6 
 55   2   8 

2回目にprintArray()が呼び出されると、実際に次の行にアクセスするのではなく、最初の行から新しい行に値を出力し続けるようです。確かにインデックス値は一定なのでわかりませんね。(つまり、matrix [1] [2]は(この場合)8ではなく12でなければなりません。

前もって感謝します。

4

2 に答える 2

4

以下:

void printArray(int rows, int columns, int matrix[rows][columns])

3番目の引数の次元がrowsxであることをコンパイラーに約束しcolumnsます。

同時に、次の行はこの約束を破ります:

printArray(2, 3, matrix);

matrix3xであり、 x5ではないからです。23

行と列のサブセットのみを印刷したい場合は、次のようにすることができます。

void
printArray(int rows, int columns, int matrix[rows][columns], int max_row, int max_col)
{
    int i, j;

    for (i = 0; i < max_row; i++)
    {
        for (j = 0; j < max_col; j++)
            printf("%3i ", matrix[i][j]);
        printf("\n");
    }           
    printf("\n");       
}

int main(void)
{
   ...
   printArray(3, 5, matrix, 3, 5);
   printArray(3, 5, matrix, 2, 3);
}
于 2012-06-16T16:08:45.213 に答える
0

http://en.wikipedia.org/wiki/Row-major_order

于 2012-06-16T16:18:22.057 に答える