我需要帮助理解这行动态创建数组的代码吗?
I need help understanding this line of code dynamically creating an array?
我开始对 malloc 进行更多练习,尽管它正确执行的代码没有任何问题。
int *arr = (int *)malloc(x * y * sizeof(int));
int i, j, r;
for(i=0; i<x; i++){
for(j=0; j<y; j++){
r = 0 + rand() % 7;
*(arr + i*y + j) = r;
//I dont understand the left hand portion of the above line.
//x and y are both 5000
我在网上找到它,在找到它之前,我曾尝试做完全相同的事情,但我想我的语法是错误的。不管怎样,我需要帮助来理解旁边有评论的那一行
*(arr + i*y + j)
试图将值存储在由 array[i][j]
表示的数组元素中。
您在上一行中从 r 接收到的值被馈送到数组的第 array[i][j]th 个元素。
arr
定位数组的基元素,添加i*y
定位到数组的第(i+1)行(C中索引从0开始),然后将 j 添加到它会生成 array[i][j]
所在的确切列(第 j+1 列)。
第一行分配的内存块被用作二维矩阵。如需更多信息,请阅读:row/column-major order。
这是一张图表:
该图可能应该根据表达式中y
的使用进行转置,但概念是相同的。每个框中的数字是线性偏移量。如您所见,线性内存块的偏移量等于行索引乘以宽度加上列索引,或 i*y + j
.
通常您所做的是声明一个二维数组 int arr[5000][5000];
或等效的 malloc 代码。
在这种情况下所做的是声明一维数组,但将其用作二维数组。这种方式也是可以的,但是会涉及不断检查位置的额外开销。
我开始对 malloc 进行更多练习,尽管它正确执行的代码没有任何问题。
int *arr = (int *)malloc(x * y * sizeof(int));
int i, j, r;
for(i=0; i<x; i++){
for(j=0; j<y; j++){
r = 0 + rand() % 7;
*(arr + i*y + j) = r;
//I dont understand the left hand portion of the above line.
//x and y are both 5000
我在网上找到它,在找到它之前,我曾尝试做完全相同的事情,但我想我的语法是错误的。不管怎样,我需要帮助来理解旁边有评论的那一行
*(arr + i*y + j)
试图将值存储在由 array[i][j]
表示的数组元素中。
您在上一行中从 r 接收到的值被馈送到数组的第 array[i][j]th 个元素。
arr
定位数组的基元素,添加i*y
定位到数组的第(i+1)行(C中索引从0开始),然后将 j 添加到它会生成 array[i][j]
所在的确切列(第 j+1 列)。
第一行分配的内存块被用作二维矩阵。如需更多信息,请阅读:row/column-major order。
这是一张图表:
该图可能应该根据表达式中y
的使用进行转置,但概念是相同的。每个框中的数字是线性偏移量。如您所见,线性内存块的偏移量等于行索引乘以宽度加上列索引,或 i*y + j
.
通常您所做的是声明一个二维数组 int arr[5000][5000];
或等效的 malloc 代码。
在这种情况下所做的是声明一维数组,但将其用作二维数组。这种方式也是可以的,但是会涉及不断检查位置的额外开销。