【问题标题】:How to use a two dimensional array in function declaration statement? [duplicate]如何在函数声明语句中使用二维数组? [复制]
【发布时间】:2016-02-11 19:01:53
【问题描述】:
void sort(int [],int);

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

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

1.多维数组除了第一个维度外,所有维度都必须有边界。

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

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

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

#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]);
        }
}

【问题讨论】:

  • 函数原型应该是函数定义的复制/粘贴,末尾加上分号。
  • 没有函数原型将只有数据类型,而函数定义将同时具有变量名称的数据类型
  • C 中没有二维(或更高)维数组。相反,您可以拥有数组的数组,这不一样。
  • @SairamD 如果你愿意,你可以选择这样做,但最终你会意识到为什么这是一个糟糕的选择。

标签: c arrays function multidimensional-array


【解决方案1】:

原型

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

应该是

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

您必须指定更高的维度。反过来说,上面的原型等价于

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

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

【讨论】:

  • 您还可以指定所有维度的边界,因此 void mat(int [10][10],int [10][10],int ,int);也是正确的。
  • @Stuart;是的。但是您可以跳过第一维的大小。
  • 是的,我知道这就是为什么我说“也是正确的”。
  • 为什么一维数组不需要指定维度
【解决方案2】:

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

  • 相反,您可以执行 [][10]。
  • 但我个人的偏好是使用像 (*a)[10] 这样的指针。因为它使事物易于可视化。

【讨论】:

    【解决方案3】:

    在 C 中,当您声明一个数组时,必须指定数组的所有维度,除了可能的最后一个维度。换句话说,你可以这样写一个函数:

    void iTakeAnArray(int[]);
    

    或者这个:

    void iTakeAnotherArray(int[][5]);
    

    但你不会写

    void oopsNotAllowed(int[][]);
    

    原因与 C 编译器通常如何表示数组有关。为了查找二维数组,编译器需要知道数组的一维有多少元素,以便在执行数组访问时知道要定位的最终内存偏移量。

    除了

    1. 让函数接收一个二维数组,您可以在其中预先固定大小,或者
    2. 用一维数组模拟一个二维数组。

    对于第二个选项,您可以用一个大小为 m x n 的一维数组来表示一个维度为 m x n 的数组。查找元素arr[i][j]。您查看数组中的位置i * n + j。这有点hacky,但它有效!

    【讨论】:

      猜你喜欢
      • 2012-04-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 2011-07-18
      • 2013-05-05
      • 1970-01-01
      相关资源
      最近更新 更多