[英]Why can't I pass a 2D array as a pointer to pointer but can pass a 1D array as a pointer
[英]How can I pass the pointer of a static 2D array to a structure/class?
當我嘗試將數組的指針(包含程序中某些函數所需的參數)傳遞給結構時,我遇到了問題,然后應該將結果傳遞給這些函數。 例如,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"
或類似的東西(翻譯自德語)。
double d[4][3];
是一個數組數組。 double b**;
是指向指針的指針。 這些類型不一樣(你可能在互聯網上閱讀的常見“數組只是指針”是錯誤的 )。
d
元素是double[3]
類型double[3]
。 傳遞時,數組會衰減到指向第一個元素的指針(參見C ++標准的4.2節)。 d
將衰減為double(*)[3]
(指向3個雙精度數組的指針)。
長話短說, double(*)[3]
不能轉換為double**
,這就是編譯器告訴你的。
如果你需要保持d
,因為它是你需要聲明B中double (*b)[3]
;
有關更深入的解釋,請參閱此SO問題 。
這是因為指向指針(或指針數組,因為它可以用作)的指針與數組數組不同。 內存中的布局不兼容。
例如,假設我們有這兩個聲明:
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] |
+---------+---------+
“array” pp
包含指向另一個“數組”的指針
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.