数组和指针之间的关系是 C 语言中比较令人困惑的方面之一。请允许我通过示例来解释。以下代码填充并显示一个简单的一维数组:
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 );
}
可以看到,当将数组传递给函数时,数组名被当作指向数组第一个元素的指针。在这个例子中,第一个元素是 an int
,所以指针是 an int *
。
现在考虑这个填充和打印二维数组的代码:
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]
二维数组有某种对应关系,而表单的指针与int *ptr
一维数组有某种对应关系。