在C语言中,多维数组名作为函数参数时,情况与一维数组类似。多维数组名也会退化为指向其首元素的指针,但这个首元素实际上是一个指向下一维数组的指针。因此,当我们把多维数组名作为参数传递给函数时,我们实际上传递的是一个指向数组的指针,而这个数组的元素是更低一维的数组或者说是指针。
以下是一个详细的示例代码,展示了如何在C语言中将二维数组名作为函数参数传递:
#include <stdio.h> // 定义一个函数,用于打印二维数组中的元素 void print2DArray(int **arr, int rows, int cols) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } // 注意:上面的print2DArray函数定义在传递二维数组时并不常见, // 因为二维数组在传递时通常会被当作指向数组的指针的指针, // 但这要求数组在函数外部是以指针数组或动态分配的形式创建的。 // 下面是一个更常见的函数定义方式,它接收一个指向首行的指针: void print2DArrayProper(int arr[][3], int rows, int cols) { // 假设列数是固定的,这里是3 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } int main() { // 定义一个3x3的二维数组 int numbers[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // 数组的行数和列数 int rows = sizeof(numbers) / sizeof(numbers[0]); int cols = sizeof(numbers[0]) / sizeof(numbers[0][0]); // 调用print2DArray函数(注意:这个函数定义在上面并不常用) // 需要将二维数组转换为指针的指针形式,这在静态分配的数组上并不直接支持 // 这里只是为了演示概念,实际上不会这样用 // 调用print2DArrayProper函数(更常用的方式) print2DArrayProper(numbers, rows, cols); // 如果需要动态分配二维数组并以指针的指针形式传递,可以这样做: // int **dynamicArray = malloc(rows * sizeof(int *)); // for (int i = 0; i < rows; i++) { // dynamicArray[i] = malloc(cols * sizeof(int)); // // 填充数组... // } // print2DArray(dynamicArray, rows, cols); // ... 释放动态分配的内存 ... return 0; }
代码解释:
- 我们首先定义了两个函数print2DArray和print2DArrayProper,它们都用于打印二维数组中的元素。但是,print2DArray函数接收一个指向指针的指针(即int **arr),这在C语言中通常用于动态分配的二维数组。而print2DArrayProper函数则接收一个指向数组的指针(这里假设列数是固定的,所以是int arr[][3])。
- 在main函数中,我们定义了一个3x3的二维数组numbers,并计算了其行数和列数。
- 我们调用了print2DArrayProper函数来打印数组中的元素。这是更常见的做法,因为它直接接收一个指向二维数组首行的指针,并假设我们知道数组的列数(在这个例子中是硬编码为3)。
- 注释部分展示了如何动态分配一个二维数组,并将其作为指针的指针传递给print2DArray函数(尽管这在静态分配的数组上并不适用)。这通常用于需要动态确定数组大小的场景。
- 请注意,当二维数组作为参数传递时,如果列数不是固定的或者需要在函数内部确定,那么通常需要将数组的行数和列数都作为参数传递给函数。这是因为在函数内部,我们无法直接通过指针运算来确定数组的列数(除非它是固定的或者作为额外的参数传递)。