如果你有一个一维数组,那么这个函数声明
void modifyArray(int *array);
是正确的,因为它等价于下面的声明
void modifyArray(int array[]);
即具有数组类型的参数被编译器调整为指向数组元素类型的指针。
虽然一般来说最好也传递数组中的元素数量,例如
void modifyArray(int *array, size_t n);
如果你想提供一个初始化器,那么函数声明可以是这样的
void modifyArray(int *array, size_t n, int value );
注意你程序中的两个函数声明是不同的
void modifyArray(int *array);
和
void modifyArray(int *array, int value, int row, int column)
另外在函数内this声明
array[row][column] = value;
将调用未定义的行为,因为可以访问数组之外的内存。
如果你有这样的数组
int array[3][3];
那么对应的函数参数会是这样的
void modifyArray( int array[][3], size_t n, int value );
或类似
void modifyArray( int ( *array )[3], size_t n, int value );
所以最好对整数文字 3 使用命名常量,比如
#define N 3
或喜欢
enum { N = 3 };
函数声明看起来像
void modifyArray( int ( *array )[N], size_t n, int value );
main 中的数组声明如下所示
int array[N][N];
函数本身也可以这样调用
modifyArray( array, N, 3 );
如果你想将数组的所有元素设置为初始化器,那么你应该在函数中编写
for ( size_t i = 0; i < n; i++ )
{
for ( size_t j = 0; j < N; j++ )
{
array[i][j] = value;
}
}
如果你的编译器支持变长数组,那么函数声明可以是这样的
void modifyArray( size_t rows, size_t cols, int array[][cols], int value );
函数可以像这样调用
modifyArray( 3, 3, array, 3 );
在这种情况下,可以为具有任意行和列值的任何二维数组调用该函数。
在函数中,循环看起来像
for ( size_t i = 0; i < rows; i++ )
{
for ( size_t j = 0; j < cols; j++ )
{
array[i][j] = value;
}
}