【问题标题】:Passing a pointer to an array of arrays to a function将指向数组数组的指针传递给函数
【发布时间】:2014-09-22 23:53:56
【问题描述】:

我有一个设置以下变量的主函数:

double matrix[numVectors][size] = {
    {0.183963, 0.933146, 0.476773, 0.086125, 0.566566, 0.728107, 0.837345, 0.885175, 0.600559, 0.142238},
    {0.086523, 0.025236, 0.252289, 0.089437, 0.382081, 0.420934, 0.038498, 0.626125, 0.468158, 0.247754},
    {0.969345, 0.127753, 0.736213, 0.264992, 0.518971, 0.216767, 0.390992, 0.242241, 0.516135, 0.990155}
};

double result1[size], result2[size];

double *ptr_matrix  = &matrix[0];
double *ptr_result1 = &result1[0];
double *ptr_result2 = &result2[0];

以上是试图做的是:

  • 创建一个包含三行 10 个双精度数的数组
  • 创建两个包含 10 个双精度的空数组
  • 创建指向矩阵的指针
  • 创建指向两个空数组的指针

然后,我试图将所有三个指针都传递给另一个函数。这个另一个函数将遍历矩阵行(仅行,它不访问整个矩阵空间),使用行(作为数组)执行计算。最终结果是开头声明的两个空数组最终分别成为矩阵中的一行。

这是第二个函数的原型:

void smallestSum(double (*mat)[size], int num, double *first, double *second)

此函数遍历矩阵行(0/1、0/2、1/2)的每个组合并检查它们的值的总和。产生最小和的两个数组最终从上面变成result1result2

鉴于这是我第一次真正深入研究指针/数组/矩阵领域,我有几个问题:

  • 我是否正确地“获取”了指向矩阵的指针?还是我需要获取指向矩阵第一个值的指针?
  • smallestSum() 中,我可以像往常一样迭代数组吗(使用for (int i = 0; i < num; i++)

【问题讨论】:

  • 使用 vector<vector<double>> 然后传递给你的函数,vector<vector<double>>& v 瞧!

标签: c++ c arrays pointers matrix


【解决方案1】:

您需要更改ptr_matrix 的定义,因为它不是指向单个双精度的指针,而是指向整行:

double (*ptr_matrix)[size] = &matrix[0];

然后,可以如下调用函数:

smallestSum(ptr_matrix, numVectors, ptr_result1, ptr_result_2);

smallestSum 中,您可以遍历行和列。

请注意,size 必须在编译时已知。

如果函数不修改矩阵,请考虑将const 添加到其第一个参数的类型。

【讨论】:

  • 甜,这有效。更有意义。但是,在遍历矩阵时,我将如何取消引用其中一行以获得该行的实际值?我目前有(*mat)[0](第一行),但这给了我double *的类型,而我想要double[]
  • @MaxMackie 您可以像使用double[] 一样使用double * 值。要访问矩阵中的单元格,可以写mat[i][j]i 是行索引,j 是列索引)。
  • 也许我在歪曲错误。在该函数中,我调用另一个函数来处理两个数组(矩阵中的行)。第二个函数的原型是second(double a1[], double a2[])。我认为double * 引起了与double[] 的冲突。有错吗?
  • @MaxMackie double[] 类型的函数参数与 double * 类型的参数相同。我认为问题在于您认为(*mat)[0] 是第一行,但实际上它是第一行的第一个元素。第一行是*matmat[0]
  • 啊,我虽然你必须取消引用 mat 指针才能到达第一行。这更有意义。感谢您填补空白!
【解决方案2】:

The answer abacabadabacaba gave 大部分是正确的,除了 size 不需要在编译时知道。如果您将size 作为函数的参数包含在内,则可以将其用作该函数其他参数的类型的一部分:

void smallestSum(int size, double (*mat)[size], int num, double *first, double *second)

【讨论】:

    猜你喜欢
    • 2017-08-09
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    相关资源
    最近更新 更多