c - 如何向结构传递/访问双指针?

标签 c pointers matrix struct double-pointer

按如下方式创建 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;

但是,如果您想创建一个矩阵,其中每行保证与任何其他行具有相同数量的元素,则更适合表示这是一个 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];

但这显然有点笨拙,实际上,通过这样的方式访问元素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 

关于c - 如何向结构传递/访问双指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40438147/

相关文章:

c - 哪个变量在C中具有更大的值比较

c - OpenMP 4.0 的卸载指令

c - 尝试比较二维数组中的字符串

c - 使用指针时 C 中的奇怪代码行为,其中注释代码的某个不相关部分会影响输出

c++ - C++ 指针是否跨 EXE 和 DLL 工作

c++ - 对象的动态数组与指针的动态数组

c++ - Armadillo C++ :- Efficient access of columns in a cube structure

opengl - 阴影贴图 - 将 View 空间位置转换为阴影贴图空间

c - 这个多空指针函数是如何工作的?

c++ - 在 C++ 中创建基本矩阵的困难