📌  相关文章
📜  如何在C中将2D数组作为参数传递?

📅  最后修改于: 2021-05-25 20:07:19             🧑  作者: Mango

这篇文章是如何在C中动态分配2D数组的扩展。

一维数组可以很容易地作为指针传递,但是将2D数组传递给函数的语法可能很难记住。传递多维数组的重要一件事是,不必指定第一个数组维。必须提供第二个(以及任何后续)尺寸

1)当两个维度都全局可用时(作为宏或全局常量)。

#include 
const int M = 3;
const int N = 3;
  
void print(int arr[M][N])
{
    int i, j;
    for (i = 0; i < M; i++)
      for (j = 0; j < N; j++)
        printf("%d ", arr[i][j]);
}
  
int main()
{
    int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    print(arr);
    return 0;
}

输出:

1 2 3 4 5 6 7 8 9

2)全局只有第二维可用时(作为宏或全局常数)。

#include 
const int N = 3;
  
void print(int arr[][N], int m)
{
    int i, j;
    for (i = 0; i < m; i++)
      for (j = 0; j < N; j++)
        printf("%d ", arr[i][j]);
}
  
int main()
{
    int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    print(arr, 3);
    return 0;
}

输出:

1 2 3 4 5 6 7 8 9

如果第二维是固定的并且不是用户指定的,则上述方法很好。以下方法可以处理第二维也可以更改的情况。

3)如果编译器兼容C99
从C99开始,C语言支持通过指定变量尺寸来简单地传递可变大小的数组(请参见示例运行)

// The following program works only if your compiler is C99 compatible.
#include 
  
// n must be passed before the 2D array
void print(int m, int n, int arr[][n])
{
    int i, j;
    for (i = 0; i < m; i++)
      for (j = 0; j < n; j++)
        printf("%d ", arr[i][j]);
}
  
int main()
{
    int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    int m = 3, n = 3;
    print(m, n, arr);
    return 0;
}

在C99兼容编译器上的输出:

1 2 3 4 5 6 7 8 9

如果编译器不兼容C99,则可以使用以下方法之一传递可变大小的2D数组。

4)使用单个指针
在此方法中,传递给函数时,我们必须对2D数组进行类型转换。

#include 
void print(int *arr, int m, int n)
{
    int i, j;
    for (i = 0; i < m; i++)
      for (j = 0; j < n; j++)
        printf("%d ", *((arr+i*n) + j));
}
  
int main()
{
    int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    int m = 3, n = 3;
  
    // We can also use "print(&arr[0][0], m, n);"
    print((int *)arr, m, n);
    return 0;
}

输出:

1 2 3 4 5 6 7 8 9

参考:
http://www.eskimo.com/~scs/cclass/int/sx9a.html

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。