5

当我尝试将数组的指针(其中包含程序中某些函数所需的参数)传递给一个结构时,我遇到了一个问题,然后应该将其传递给这些函数。例如,GSL 希望我以这种方式传递参数。

一个小示例程序如下所示:

#include <iostream>

using namespace std;

struct myparams
{
    double  * a;
    double ** b;
};

int main()
{
    double c[10]   = {0,1,2,3,4,5,6,7,8,9};
    double d[4][3] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}};

    double** e = new double*[4];
    for (int i = 0; i < 4; i++) {
       e[i] = new double[3];
    }

    myparams params;

    // THIS WORKS:
    params.a = c;
    for (int i = 0; i < 10; i++) {
        cout << params.a[i] << endl;
    }

    // THIS DOESN'T WORK
    params.b = d;

    // THIS WORKS:
    params.b = e;

    delete[] e;
}

有什么问题

 params.b = d

编译器抱怨"cannot convert 'double[4][3]' to 'double**' in assignment"或类似的东西(从德语翻译)。

4

2 回答 2

9

double d[4][3];是一个数组数组。double b**;是指向指针的指针。这些类型并不相同(您可能在 Internet 上阅读的常见“数组只是指针”是错误的)。

的元素d属于 type double[3]。数组在传递时会衰减为指向其第一个元素的指针(参见 C++ 标准的第 4.2 节)。d将衰减到double(*)[3](指向 3 个双精度数组的指针)。

长话短说,double(*)[3]不能转换成double**这就是编译器告诉你的。

如果需要保持d原样,则需要将 b 声明为double (*b)[3];

有关更深入的解释,请参阅此 SO question

于 2013-02-15T14:16:15.087 回答
7

这是因为指向指针(或可以用作指针数组)的指针与数组数组不同。内存中的布局不兼容。

例如,假设我们有这两个声明:

char aa[2][2] = { { 'a', 'b' }, { 'c', 'd' } };
char **pp;

pp = new char*[2];
pp[0] = new char[2];
pp[1] = new char[2];

数组aa在内存中如下所示:

+----------+----------+----------+----------+
| aa[0][0] | aa[0][1] | aa[1][0] | aa[1][1] |
+----------+----------+----------+----------+

“数组”pp同时看起来像这样:

+------+------+
| a[0] | a[1] |
+------+------+
   |      |
   |      v
   |      +---------+---------+
   |      | a[0][0] | a[0][1] |
   |      +---------+---------+
   V
   +---------+---------+
   | a[0][0] | a[0][1] |
   +---------+---------+

“数组”pp包含指向另一个“数组”的指针

于 2013-02-15T14:08:32.297 回答