2016-11-05 28 views
0

10×10矩陣創建如下:如何向/從結構傳遞/訪問雙指針?

double **c = (double **)pvPortMalloc(ROW * sizeof(double*)); 
for (i = 0; i < ROW; i++) 
    c[i] = (double *)pvPortMalloc(COL * sizeof(double)); 

我想通過double **cstruct

struct AMessage { 
    char cMessageID; 
    double (**doublePtr); 
} xMessage; 

在我要訪問的結構結束,並打印矩陣屏幕上,但是,我不確定我應該怎麼去使用雙指針...

+1

你試過'xMessage.doublePtr = c;'? – mch

回答

1

首先,直接回答你的問題,如果你定義一個矩陣,並希望將其指針存儲在一個stru ct,你可以通過直接分配來完成。從您的身體力行上,你可以做一個struct AMessage點你c已分配的內存的doublePointer成員通過這樣的簡單:

struct AMessage am; 
am.doublePtr = c; 

但是,如果你想創建一個矩陣,其中每行保證與其他行有相同數量的元素,更適合表示這是一個2D數組,而不是指向其他數組的指針數組。

2D陣列用C可以聲明如下所示:

double matrix[ROW][COL]; 

此聲明瞭一個名爲matrix可變的,ROW行和COL列。

沒有什麼可以阻止你,包括你的struct定義這個定義直,使你的結構的定義是這樣的:

struct AMessage 
{ 
    char MessageId; 
    double matrix[ROW][COL]; 
}; 

(感謝chqrlie的提示這一點)

如果你一定需要一個指向二維數組的指針來存放你的struct(例如,你可能想要用你的兩個struct引用一個大數組),你需要知道C中的二維數組真的是一維數組,只能以某種方式解決。

可以動態地分配存儲器將用於使基質與一個調用的malloc:

double *c = malloc(ROW * COL * sizeof(*c)); 

一個用於在j列訪問元素的元素的選擇,行i是:

double a = c[ROW * j + i]; 

但這顯然有點笨重,真的,通過類似這樣的方式訪問元件i,j更方便:

double a = d[j][i]; 

要定義指針d,我們可以像這樣解引用,我們需要考慮d[j]是什麼類型。它並不像許多人認爲的那樣,而是指向一組數字ROWdouble s。在C語法,你將宣佈d像這樣:

double (*d)[ROW]; 

最後解決你的問題,我會定義你的結構是這樣的:

struct AMessage 
{ 
    char MessageId; 
    double (*matrix)[ROW]; 
} 

分配到這個struct會是這個樣子:

struct AMessage am; 
am.matrix = malloc(ROW * COL * sizeof(*am.matrix)); 
am.matrix[j][i] = 42; // Assigns 42 to row j, column i 
+0

你也可以證明結構的'matrix'成員可以被定義爲'double matrix [ROW] [COL];'並直接使用相同的語法。 – chqrlie

+0

這是一個好主意,也許是在大多數情況下最好的方法。我已經放入了,謝謝! –

+0

也給出了OPs問題的直接答案:將'c'存儲到結構中僅僅是將成員定義爲'double **矩陣;'並且簡單的指針分配完成這項工作。 3種不同的方式來處理2維矩陣。 – chqrlie