C语言中经常遇到需要将二维数组作为函数参数传递到函数中并进行访问或处理的操作,此处以打印二维数组为例,总结了二维数组作为函数参数的几种方式,包括形参定义、函数中数组元素的访问及函数调用。需要注意的是,虽然方式一和方式二中可以以matrix[row][col]的方式访问到元素,但是并不推荐使用这种方式,因为一旦二维数组作为函数参数,就应当把其数组名当成一个指针看待,同时将二维数组对应的行数和列数也作为参数传递给函数,这样就可以通过指针偏移的方式访问到相应的元素。
1. 方式一
//void printMatrix(int matrix[3][3], int matrixRow, int matrixCol) // 直接以二维数组方式定义
void printMatrix(int matrix[][3], int matrixRow, int matrixCol) // 省略第一维
{
int row, col;
for (row = 0; row < matrixRow; row++)
{
for (col = 0; col < matrixCol; col++)
//printf("%d ", matrix[row][col]); // 以下标方式访问
//printf("%d ", *(*(matrix + row) + col)); // 以指针方式访问
//printf("%d ", *(matrix[row] + col)); // 先通过行下标找到元素所在的一维数组,再以指针方式访问
printf("%d ", *((int*)matrix + row * matrixCol + col)); // 先强转换,再通过计算下标来访问
printf("\n");
}
}
int main()
{
int matrix[3][3] = { {1, 3, 5}, {2, 4, 6}, {3, 6, 9} };
int matrixRow = sizeof(matrix) / sizeof(matrix[0]);
int matrixCol = sizeof(matrix[0]) / sizeof(matrix[0][0]);
printMatrix(matrix, matrixRow, matrixCol); // 此处调用数组直接用数组名
return 0;
}
2. 方式二
void printMatrix(int (*matrix)[3], int matrixRow, int matrixCol) // 以数组指针方式定义
{
int row, col;
for (row = 0; row < matrixRow; row++)
{
for (col = 0; col < matrixCol; col++)
//printf("%d ", matrix[row][col]); // 以下标方式访问
//printf("%d ", *(*(matrix + row) + col)); // 以指针方式访问
//printf("%d ", *(matrix[row] + col)); // 先通过行下标找到元素所在的一维数组,再以指针方式访问
printf("%d ", *((int*)matrix + row * matrixCol + col)); // 先强制转换,再通过计算下标来访问
printf("\n");
}
}
int main()
{
int matrix[3][3] = { {1, 3, 5}, {2, 4, 6}, {3, 6, 9} };
int matrixRow = sizeof(matrix) / sizeof(matrix[0]);
int matrixCol = sizeof(matrix[0]) / sizeof(matrix[0][0]);
printMatrix(matrix, matrixRow, matrixCol); // 此处调用数组直接用数组名
return 0;
}
3. 方式三
void printMatrix(int** matrix, int matrixRow, int matrixCol) // 以二级指针方式定义
{
int row, col;
for (row = 0; row < matrixRow; row++)
{
for (col = 0; col < matrixCol; col++)
printf("%d ", *((int*)matrix + row * matrixCol + col)); // 只能通过强转再按偏移进行访问
printf("\n");
}
}