C 如何在函数声明语句中使用二维数组?

C 如何在函数声明语句中使用二维数组?,c,arrays,function,multidimensional-array,C,Arrays,Function,Multidimensional Array,这就是我通常在函数声明语句中使用一维数组(即:int[])进行排序之类的程序的方式,它工作正常,没有任何问题 但是对于我的矩阵加法程序,当我在一个函数声明语句中使用一个二维数组(即:int[]][)时,它的格式类似于void mat(int[]],int[]],int,int); Iam收到一些错误消息,如:- 1.多维数组必须具有除第一个维度外的所有维度的边界 2.从“int(*)[10]”到“int”[-fpermissive]的转换无效 所以我的问题是如何在函数声明语句中编写二维数组 下面

这就是我通常在函数声明语句中使用一维数组(即:
int[]
)进行排序之类的程序的方式,它工作正常,没有任何问题

但是对于我的矩阵加法程序,当我在一个函数声明语句中使用一个二维数组(即:
int[]][
)时,它的格式类似于
void mat(int[]],int[]],int,int);
Iam收到一些错误消息,如:-

1.多维数组必须具有除第一个维度外的所有维度的边界

2.从“int(*)[10]”到“int”[-fpermissive]的转换无效

所以我的问题是如何在函数声明语句中编写二维数组

下面我附上了使用函数的完整矩阵加法程序:-

void sort(int [],int);
#包括
空垫(int[]],int[]],int,int);
int main()
{
INTA[10][10],b[10][10],m,n,i,j;
printf(“输入行和列:”);
scanf(“%d%d”,&m,&n);
printf(“\n输入第一个矩阵的元素:”);

对于C中的(i=0;i,当您声明数组时,必须指定数组的所有维度(可能最后一个维度除外)。换句话说,您可以编写如下函数:

#include<stdio.h> 
void mat(int [][],int [][],int ,int);
int main()
{
    int a[10][10],b[10][10],m,n,i,j;
    printf("Enter the rows and coloumns: ");
    scanf("%d %d",&m,&n);
    printf("\nEnter the elements of 1st Matrix:");
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
        scanf("%d",&a[i][j]);
    printf("\nEnter the elements of the 2nd Matrix:");
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
            scanf("%d",&b[i][j]);
    mat(a,b,m,n);
}
void mat(int a[10][10],int b[10][10],int m,int n)
{
    int i,j,c[10][10];
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
        c[i][j]=a[i][j]+b[i][j];
        printf("\nThe addition of the 2 Matrix is :");
        for(i=0;i<m;i++)
        {
            printf("\n");
            for(j=0;j<n;j++)
            printf("%d",c[i][j]);
        }
}
或者这个:

void iTakeAnArray(int[]);
但你不会写字

void iTakeAnotherArray(int[][5]);
原因与C编译器通常如何表示数组有关。为了查找2D数组,编译器需要知道数组的一个维度上有多少个元素,以便在执行数组访问时知道要定位的最终内存偏移量

除此之外,没有一个干净的方法可以解决这个问题

  • 让函数接收2D数组,在该数组中预先确定大小,或者
  • 使用一维阵列模拟二维阵列
  • 对于第二个选项,您可以用一个尺寸为m x n的一维数组来表示一个尺寸为m x n的数组。要查找元素
    arr[i][j]
    。您可以查看数组中的位置
    i*n+j
    。这有点老套,但它可以工作!

    原型

    void oopsNotAllowed(int[][]);
    
    应该是

    void mat(int [][],int [][],int ,int);  
    
    您必须指定更高的维度。换句话说,上面的原型相当于

    void mat(int [][10],int [][10],int ,int);  
    

    int(*)[10]
    是一种类型(指向10
    int
    数组的指针),没有大小
    10
    它是一种不完整的类型。

    亲爱的,你不能以这种方式初始化C中的二维数组a[][]。它如何知道有多少列

    • 相反,您可以执行[][10]
    • 但我个人的偏好是使用类似(*a)[10]的指针,因为它使事情更容易可视化

    函数原型应该是函数定义的副本/粘贴,并在末尾加上分号。没有函数原型将只包含数据类型,而函数定义将包含两个数据类型和变量名。没有两个(或更高级别)C语言中的维度数组。相反,你可以有不同的数组数组。@SairamD如果你愿意,你可以选择这样做,但最终你会意识到这是一个错误的选择。你还可以指定所有维度的边界,因此无效mat(int[10][10],int[10][10],int,int);也是正确的。@Stuart;是的。但是你可以跳过第一个维度的尺寸。是的,我知道这就是为什么我说“也是正确的”。但是为什么没有必要指定单个维度的尺寸呢array@SairamD;
    void mat(int (*)[10],int (*)[10],int ,int);