Alt*_*ris 7 c memory pointers memory-management
我很难完全理解正在发生的事情.
这就是我在底部阅读代码的方式.
将A定义为指向指向double地址的指针地址的指针.
在堆上分配4个内存块,每个内存块可以将地址保存为double.返回分配给A的第一个块的地址.
在堆上分配6个内存块,每个内存块可以保存双数据类型,并为之前分配的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和正式的编程实践.我知道我对这么简单的代码行很迂腐,但我想确保我正确理解指针和内存分配.乍一看他们很难理解.这是我教授给我的矩阵乘法代码的一部分,我希望将指针传递给函数并让它访问并修改内存中的正确值.个人希望看到这个代码的二维数组,但我假设有一个很好的理由.
您还可以连续存储它并进行数学计算,而不是让编译器为您做它
所以:
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]
会在堆栈上为你做