对指针指针和动态内存分配感到困惑

Alt*_*ris 7 c memory pointers memory-management

我很难完全理解正在发生的事情.

这就是我在底部阅读代码的方式.

  1. 将A定义为指向指向double地址的指针地址的指针.

  2. 在堆上分配4个内存块,每个内存块可以将地址保存为double.返回分配给A的第一个块的地址.

  3. 在堆上分配6个内存块,每个内存块可以保存双数据类型,并为之前分配的4个块中的每个块返回第一个块的地址.

  4. 变量A仍然包含四个指针的第一个块的地址,假设A [0]改变了A指向的地址而不是A本身的值.

现在这是图表的底部链接的地方.让我们说我想访问存储在红色块中的数据.我该怎么办?

以下代码是否有效?

double data = *(*(A + 3) + 2);
Run Code Online (Sandbox Code Playgroud)

我的逻辑是A是一个指针,递增3应该增加地址的大小(double*)的字节数.取消引用地址(A + 3),我将获得第一个块的地址(假设它没有被重新分配).通过将结果地址增加2并取消引用该地址,我应该获得红色块的值.

因此,如果我理解正确,1 + M指针存储在内存中.为什么?如果目标是存储MxN数据,为什么我需要1 + M指针才能这样做?如果我想定义不同大小的行但是目标是定义矩形数据数组,额外的指针似乎会有用.

const int M = 4;
const int N = 6;
double **A;

A = malloc(M*sizeof(double *));

for (i = 0; i < N; i++) {
    A[i]= malloc(N*sizeof(double));
}
Run Code Online (Sandbox Code Playgroud)

图:

在此输入图像描述

旁注:我是电气工程专业的学生,​​在某种程度上不熟悉C和正式的编程实践.我知道我对这么简单的代码行很迂腐,但我想确保我正确理解指针和内存分配.乍一看他们很难理解.这是我教授给我的矩阵乘法代码的一部分,我希望将指针传递给函数并让它访问并修改内存中的正确值.个人希望看到这个代码的二维数组,但我假设有一个很好的理由.

Gle*_*aum 3

您还可以连续存储它并进行数学计算,而不是让编译器为您做它

所以:

double * A = malloc (M * N * sizeof(double));

double get(double * what, cur_x, cur_y, max_x, max_y)
{
    return *(what+cur_x*max_y+cur_y);
}
Run Code Online (Sandbox Code Playgroud)

这将节省所有间接,因为您知道大小

如果您不需要动态分配大小,这就是

double A[17][14]会在堆栈上为你做