您声明了一个二维数组。
int Arr[rows][column];
用于此函数调用中的表达式
find_saddle_point((Arr,rows);
它被隐式转换为指向其第一个元素的指针,类型为int ( * )[column]。
但是对应的参数有int *类型,并且没有从int ( * )[column]类型到int *类型的隐式转换。
void find_saddle_point(int *,int);
所以编译器会报错。
至于你的临时“解决方案”
find_saddle_point(((int *)Arr,rows);
那么它可能会导致未定义的行为。
像这样声明函数
void find_saddle_point( int, int, int [][*]);
在其定义中,您应指定参数的名称。
void find_saddle_point( int row, int column, int [][column])
{
// ...
}
此外,对于数组的维度,最好使用类型 size_t 而不是类型 int。
这是一个演示程序。
#include <stdio.h>
void find_saddle_point( size_t, size_t, int a[][*] );
void fill( size_t rows, size_t cols, int a[][cols] )
{
for ( size_t i = 0; i < rows; i++ )
{
for ( size_t j = 0; j < cols; j++ )
{
a[i][j] = i * cols + j;
}
}
}
int main(void)
{
size_t rows = 3;
size_t cols = 5;
int a[rows][cols];
fill( rows, cols, a );
for ( size_t i = 0; i < rows; i++ )
{
for ( size_t j = 0; j < cols; j++ )
{
printf( "%2d ", a[i][j] );
}
putchar( '\n' );
}
return 0;
}
它的输出是
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
当然,这个简单程序中的第一个函数声明是多余的,仅用于演示如何声明具有可变长度数组类型的参数的函数。