2016-11-05 66 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