如何 pass/access 双指针 to/from 结构?

How to pass/access a double pointer to/from a struct?

一个10x10的矩阵创建如下:

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

我想将 double **c 传递给 struct:

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

最后我想访问结构并在屏幕上打印矩阵,但是,我不确定我应该如何使用双指针来处理这个...

首先,直接回答您的问题,如果您以这种方式定义矩阵并希望将其指针存储在结构中,则可以通过直接赋值来实现。继续你的例子,你可以让 struct AMessagedoublePointer 成员指向你在 c 分配的内存,只需通过这样的事情:

struct AMessage am;
am.doublePtr = c;

但是如果你想创建一个矩阵,其中每一行都保证与任何其他行具有相同数量的元素,那么更适合表示它的是二维数组,而不是指针数组其他数组。

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));

用于访问第 ji 行中元素的一个选项是:

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

但这显然有点笨拙,真的,通过这样的方式访问元素 ij 更方便:

double a = d[j][i];

要定义我们可以像这样取消引用的指针 d,我们需要考虑 d[j] 是什么类型。它不是许多人认为的 double *,而是指向 ROW double 数组的指针。在 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