5

KR C 本の 112 ページには、次のように書かれています。

int (*arr1)[10];

10 個の整数の配列へのポインタです。上記と次の違いがわかりません:

int arr2[10];

1-arr2それ自体が 10 個の整数の配列へのポインターではありませんか? (配列の名前はポインタそのものなので。)

2- 配列の名前が配列アドレスとその配列へのポインタである場合、arr1との両方arr2が整数の配列へのポインタです。これは本当ですか?

4

3 に答える 3

1

配列とポインターの関係は、C の複雑な側面の 1 つです。例を挙げて説明しましょう。次のコードは、単純な 1 次元配列を入力して表示します。

void showArray( int *ptr, int length )
{
    for ( int i = 0; i < length; i++ )
        printf( "%d ", ptr[i] );
    printf( "\n" );
}

int main( void )
{
    int array[10];
    for ( int i = 0; i < 10; i++ )
        array[i] = i;
    showArray( array, 10 );
}

配列が関数に渡されると、配列名が配列の最初の要素へのポインターとして取得されることがわかります。この例では、最初の要素が であるintため、ポインタはint *です。

次に、2 次元配列を埋めて出力する次のコードを考えてみましょう。

void showArray( int (*ptr)[10], int rows, int cols )
{
    for ( int r = 0; r < rows; r++ )
    {
        for ( int c = 0; c < cols; c++ )
            printf( "%2d ", ptr[r][c] );
        printf( "\n" );
    }
}

int main( void )
{
    int array[5][10];
    for ( int row = 0; row < 5; row++ )
        for ( int col = 0; col < 10; col++ )
            array[row][col] = row * 10 + col;
    showArray( array, 5, 10 );
}

配列名は、配列の最初の要素へのポインターのままです。ただし、この例では、配列の最初の要素自体が配列であり、具体的には 10 の配列ですint。したがって、関数内のポインターは 10 の配列へのポインターintです。

私が印象づけたいのは、フォームのポインターは(int *ptr)[10]2 次元配列に対応しているのに対し、フォームのポインターはint *ptr1 次元配列に対応しているということです。

于 2016-09-22T02:13:34.477 に答える