簡體   English   中英

如何將靜態2D數組的指針傳遞給結構/類?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM