定义一个矩阵并将其传递给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