如何将静态2D数组的指针传递给结构/类?

Gri*_*son 5 c++

当我尝试将数组的指针(包含程序中某些函数所需的参数)传递给结构时,我遇到了问题,然后应该将结果传递给这些函数.例如,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;
}
Run Code Online (Sandbox Code Playgroud)

有什么问题

 params.b = d
Run Code Online (Sandbox Code Playgroud)

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

jro*_*rok 9

double d[4][3];是一个数组数组.double b**;是指向指针的指针.这些类型不一样(你可能在互联网上阅读的常见"数组只是指针"是错误的).

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

简而言之,double(*)[3]不可转换double**,这就是编译器告诉你的.

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

有关更深入的解释,请参阅此SO问题.


Som*_*ude 6

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

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

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

pp = new char*[2];
pp[0] = new char[2];
pp[1] = new char[2];
Run Code Online (Sandbox Code Playgroud)

数组aa在内存中看起来像这样:

+----------+----------+----------+----------+
| aa[0][0] | aa[0][1] | aa[1][0] | aa[1][1] |
+----------+----------+----------+----------+
Run Code Online (Sandbox Code Playgroud)

"阵列" pp同时看起来像这样:

+------+------+
| a[0] | a[1] |
+------+------+
   |      |
   |      v
   |      +---------+---------+
   |      | a[0][0] | a[0][1] |
   |      +---------+---------+
   V
   +---------+---------+
   | a[0][0] | a[0][1] |
   +---------+---------+
Run Code Online (Sandbox Code Playgroud)

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