当我尝试将数组的指针(包含程序中某些函数所需的参数)传递给结构时,我遇到了问题,然后应该将结果传递给这些函数.例如,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"或类似的东西(翻译自德语).
这是因为指向指针(或指针数组,因为它可以用作)的指针与数组数组不同.内存中的布局不兼容.
例如,假设我们有这两个声明:
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包含指向另一个"数组"的指针