如何在C中将2D数组作为参数传递?

2021年3月16日16:25:53 发表评论 914 次浏览

这篇文章是对如何在C中动态分配2D数组

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

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

#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
  
// 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 <stdio.h>
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

本文作者:阿比·拉西(Abhay Rathi)。如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请发表评论。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: