定义一个矩阵并将其传递给C中的函数

定义一个矩阵并将其传递给C中的函数,c,matrix,C,Matrix,我想创建一个程序,在这个程序中,我可以使用指针将矩阵传递给函数。 我初始化并扫描了void main()中的两个矩阵,然后尝试将它们传递给void add函数。我认为我在声明和调用函数的语法方面出错了。我分配了一个指向矩阵基址的指针。(例如:int*x=a[0][0],*y=b[0][0])。什么是正确的声明?我如何指定尺寸?类似这样的东西应该可以做到这一点 #define COLS 3 #define ROWS 2 /* Store sum of matrix a and b in a */

我想创建一个程序,在这个程序中,我可以使用指针将矩阵传递给函数。
我初始化并扫描了
void main()
中的两个矩阵,然后尝试将它们传递给
void add
函数。我认为我在声明和调用函数的语法方面出错了。我分配了一个指向矩阵基址的指针。(例如:
int*x=a[0][0],*y=b[0][0]
)。什么是正确的声明?我如何指定尺寸?

类似这样的东西应该可以做到这一点

#define COLS 3
#define ROWS 2

/* Store sum of matrix a and b in a */
void add(int a[][COLS], int b[][COLS])
{
    int i, j;

    for (i = 0; i < ROWS; i++)
        for (j = 0; j < COLS; j++)
            a[i][j] += b[i][j];
}

int main()
{
    int a[ROWS][COLS] = { { 5, 10, 5} , { 6, 4, 2 } };
    int b[ROWS][COLS] = { { 2, 3, 4} , { 10, 11, 12 } };

    add(a, b);

    return 0;
}
#定义COLS 3
#定义第2行
/*将矩阵a和b的和存储在a中*/
无效添加(整数a[][COLS],整数b[][COLS])
{
int i,j;
对于(i=0;i
编辑:除非您希望在运行时指定尺寸,否则在这种情况下,您必须使用平面阵列并自己执行二维阵列算法:

/* Store sum of matrix a and b in a */
void add(int rows, int cols, int a[], int b[])
{
    int i, j;

    for (i = 0; i < rows; i++)
        for (j = 0; j < cols; j++)
            a[i * cols + j] += b[i * cols + j];
}
/*将矩阵a和b的和存储在a中*/
void add(整数行、整数列、整数a[]和整数b[])
{
int i,j;
对于(i=0;i
像这样的东西应该可以奏效

#define COLS 3
#define ROWS 2

/* Store sum of matrix a and b in a */
void add(int a[][COLS], int b[][COLS])
{
    int i, j;

    for (i = 0; i < ROWS; i++)
        for (j = 0; j < COLS; j++)
            a[i][j] += b[i][j];
}

int main()
{
    int a[ROWS][COLS] = { { 5, 10, 5} , { 6, 4, 2 } };
    int b[ROWS][COLS] = { { 2, 3, 4} , { 10, 11, 12 } };

    add(a, b);

    return 0;
}
#定义COLS 3
#定义第2行
/*将矩阵a和b的和存储在a中*/
无效添加(整数a[][COLS],整数b[][COLS])
{
int i,j;
对于(i=0;i
编辑:除非您希望在运行时指定尺寸,否则在这种情况下,您必须使用平面阵列并自己执行二维阵列算法:

/* Store sum of matrix a and b in a */
void add(int rows, int cols, int a[], int b[])
{
    int i, j;

    for (i = 0; i < rows; i++)
        for (j = 0; j < cols; j++)
            a[i * cols + j] += b[i * cols + j];
}
/*将矩阵a和b的和存储在a中*/
void add(整数行、整数列、整数a[]和整数b[])
{
int i,j;
对于(i=0;i
@caf展示了一个很好的代码示例

我想指出:

我指定了一个指向底部的指针 我的矩阵的地址。(例如:int *x=a[0][0],*y=b[0][0])

您没有指定指向矩阵基的指针。这样做的目的是分配给x和y所指的值,分别是a和b中的基值

正确的方法是

int  (*x)[] = a;
int  (*y)[] = b;
或者

int *x = &a[0][0];
int *y = &b[0][0];

@caf展示了一个很好的代码示例

我想指出:

我指定了一个指向底部的指针 我的矩阵的地址。(例如:int *x=a[0][0],*y=b[0][0])

您没有指定指向矩阵基的指针。这样做的目的是分配给x和y所指的值,分别是a和b中的基值

正确的方法是

int  (*x)[] = a;
int  (*y)[] = b;
或者

int *x = &a[0][0];
int *y = &b[0][0];
给定一个二维数组

T a[N][M];
指向该数组的指针如下所示

T (*ap)[M];
void add(int (*a)[COLS], int (*b)[COLS]) {...}
因此,您的add函数原型应该如下所示

T (*ap)[M];
void add(int (*a)[COLS], int (*b)[COLS]) {...}
被称为

int main(void)
{
  int a[ROWS][COLS];
  int b[ROWS][COLS];
  ...
  add(a, b);
然而,这段代码突出了几个问题。首先,add函数依赖的信息不是通过参数列表传递的,而是通过全局变量或符号常量传递的;即行数(列数在参数类型中显式提供)。这将add函数紧密地耦合到这个特定的程序中,使得它很难在其他地方重用。出于您的目的,这可能不是问题,但通常您只希望函数通过参数列表和返回值与其调用者通信

第二个问题是,正如所写的那样,您的函数只适用于行和列的矩阵;如果要在同一程序中添加不同大小的矩阵,此方法将不起作用。理想情况下,您需要一个add函数来处理不同大小的矩阵,这意味着您需要将大小作为单独的参数传入。这还意味着我们必须更改传入的指针的类型

一种可能的解决方案是将矩阵视为指向int的简单指针,并手动计算偏移量,而不是使用下标:

void add (int *a, int *b, size_t rows, size_t cols)
{
  size_t i;
  for (i = 0; i < rows; i++)
  {
    size_t j;
    for (j = 0; j < cols; j++)
    {
      *(a + cols * i + j) += *(b + cols * i + j);
    }
  }
}
a[0]和b[0]的类型是“int的COLS元素数组”;在此上下文中,它们都将隐式转换为“指向int的指针”。类似地,c[0]和d[0]也隐式转换为int*。add()函数中的偏移量起作用,因为二维数组是连续的

编辑我刚刚意识到我是在回应caf的例子,而不是OP,caf编辑了他的回应,以展示与我的例子非常相似的东西。这是游击队。我将留下我的示例,只是为了展示一种稍微不同的方法。我还认为关于在函数和调用者之间传递信息的措辞很有价值

给定一个二维数组

T a[N][M];
指向该数组的指针如下所示

T (*ap)[M];
void add(int (*a)[COLS], int (*b)[COLS]) {...}
因此,您的add函数原型应该如下所示

T (*ap)[M];
void add(int (*a)[COLS], int (*b)[COLS]) {...}
被称为

int main(void)
{
  int a[ROWS][COLS];
  int b[ROWS][COLS];
  ...
  add(a, b);
然而,这段代码突出了几个问题。首先,add函数依赖的信息不是通过参数列表传递的,而是通过全局变量或符号常量传递的;即行数(列数在参数类型中显式提供)。这将add函数紧密地耦合到这个特定的程序中,使得它很难在其他地方重用。出于您的目的,这可能不是问题,但通常您只希望函数通过参数列表和返回值与其调用者通信

第二个问题是,正如所写的那样,您的函数只适用于行和列的矩阵;如果要在同一程序中添加不同大小的矩阵,此方法将不起作用。理想情况下,您需要一个add函数来处理不同大小的矩阵,即y