按如下方式创建 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;
但是,如果您想创建一个矩阵,其中每行保证与任何其他行具有相同数量的元素,则更适合表示这是一个 2D 数组,而不是指向其他数组的指针数组.
C 中的二维数组可以这样声明:
double matrix[ROW][COL];
这声明了一个名为 matrix
的变量,其中包含 ROW
行和 COL
列。
没有什么可以阻止您直接在 struct
的定义中包含此定义,使结构的定义如下:
struct AMessage
{
char MessageId;
double matrix[ROW][COL];
};
(感谢 chqrlie 的建议)
如果您确实希望在您的struct
中存在一个指向二维数组的指针(例如,您可能希望让一个大数组被您的两个struct
引用) s) 您需要知道 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
关于c - 如何向结构传递/访问双指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40438147/