如何 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 AMessage
的 doublePointer
成员指向你在 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));
用于访问第 j
行 i
行中元素的一个选项是:
double a = c[ROW * j + i];
但这显然有点笨拙,真的,通过这样的方式访问元素 i
、j
更方便:
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
一个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 AMessage
的 doublePointer
成员指向你在 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));
用于访问第 j
行 i
行中元素的一个选项是:
double a = c[ROW * j + i];
但这显然有点笨拙,真的,通过这样的方式访问元素 i
、j
更方便:
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