[英]About matrix operations
这是一个理论问题,没有必要展示代码。
所以,我想知道如何返回和 function 的结果,这将使用指针添加两个 arrays。
首先,矩阵是否应该在一开始就声明为指针?
因此,在 function 中,我们将拥有
void sumMatrix (int ** m) (?)
从这里开始,如何继续返回这个和的结果,因为矩阵本身无法返回
选项包括:
向 function 传递一个指向您希望存储结果矩阵的位置的指针。
在 function 中编写代码为结果矩阵分配空间并返回指向该空间的指针。
创建一个结构类型来保存结果矩阵,并让 function 按值返回该结构。
将结果写入其中一个输入矩阵。
不可能将任何维度的 arrays 传递给 C 中的函数。 甚至无法表达这个概念,因为在大多数情况下,包括函数调用表达式,数组类型的值会自动转换为指针。 因此,
但是,您应该考虑一下具体的指针类型。 C multidimensional arrays (eg int arr[3][4]
) are structured as arrays of arrays, and the aforementioned automatic conversions yield pointers to arrays ( int (*p)[4]
), not pointers to pointers. 另一方面,您可以构造指针的 arrays ( int *arr[3]
) 并使用与多维 arrays 相同的语法来访问它们。 这些到指针的自动转换确实会产生双指针( int **p
)。 尽管访问语法匹配,但这些替代方案在 memory 布局和访问效率方面非常不同。
void sumMatrix(int r, int c, int **m1, int **m2);
这适用于指针数组数据布局。 你表达了同样的事情void sumMatrix(int r, int c, int *m1[], int *m2[]);
,我可能会倾向于自己这样做。void sumMatrix(int r, int c, int m1[r][c], int m2[r][c]);
这相当于void sumMatrix(int r, int c, int m1[][c], int m2[][c]);
并void sumMatrix(int r, int c, int (*m1)[c], int (*m2)[c]);
这些依赖于 C99 中添加到 C 的可变长度数组功能,值得知道的是,此功能在 C11 中成为可选。 它假设紧凑、高效的数组数组数据布局。void sumMatrix(int r, int c, int *m1, int *m2);
或者,等效地,void sumMatrix(int r, int c, int m1[], int m2[]);
这假设与前面的数组数据布局相同,但需要您手动执行索引计算( x * c + y
)。 如果您想要具有可变数组尺寸的数组布局,而不依赖于 VLA,这将很有用。就个人而言,我倾向于选择数组数组布局和第二个签名选项的变体之一。
从这里开始,如何继续返回这个和的结果,因为矩阵本身无法返回
您仍然有多个选项,但我倾向于添加第五个参数,其类型与第三个和第四个相同,表示结果矩阵。 因为,同样,它必须是一个指针,所以调用者可以看到由 function 写入指向的 object 的数据。 然后调用者将负责传递指向现有 object 的指针,这很方便,因为它允许(但不要求)使用自动分配的 object。
因此,一种完全的可能性是
void sumMatrix(int r, int c, int m1[r][c], int m2[r][c], int result[r][c]) {
// ...
}
可以这样调用:
int a[3][4], b[3][4], c[3][4];
// ... fill arrays a and b ...
summMatrix(3, 4, a, b, c);
// the result is in matrix c
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.