KR C 本の 112 ページには、次のように書かれています。
int (*arr1)[10];
10 個の整数の配列へのポインタです。上記と次の違いがわかりません:
int arr2[10];
1-arr2
それ自体が 10 個の整数の配列へのポインターではありませんか? (配列の名前はポインタそのものなので。)
2- 配列の名前が配列アドレスとその配列へのポインタである場合、arr1
との両方arr2
が整数の配列へのポインタです。これは本当ですか?
配列とポインターの関係は、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 *ptr
1 次元配列に対応しているということです。