美文网首页
[C指针]指针与数组:动态分配二维数组,使内存连续或不一定连续

[C指针]指针与数组:动态分配二维数组,使内存连续或不一定连续

作者: AkuRinbu | 来源:发表于2019-04-13 15:54 被阅读0次

学习笔记

《深入理解C指针》
http://www.ituring.com.cn/book/1147
第4章 指针与数组

9、动态分配二维数组

(1) 分配可能不连续的内存

  • int **matrix = (int **) malloc(rows * sizeof(int *));

int **matrix = (int **) malloc(rows * sizeof(int *));
对于matrix而言,它获得了一块动态分配的连续内存,这块连续的内存可以放两个地址(因为rows值是2)

为每一行,申请一次动态内存分配,这样分配的内存就不一定连续了

for (int i = 0; i < rows; i++) {
        matrix[i] = (int*) malloc(columns * sizeof(int));
    }
内层的两个行各自的数组,没必要连在一起了 动态分配可能不连续的内存

(2) 分配连续的内存

  • int **matrix = (int **) malloc(rows * sizeof(int *));

int **matrix = (int **) malloc(rows * sizeof(int *));
对于matrix而言,它获得了一块动态分配的连续内存,这块连续的内存可以放两个地址(因为rows值是2)

一次性动态申请好全部的内存,然后计算每行的开始地址,用单个下标访问matrix,进行赋值

matrix[0] = (int *) malloc(rows * columns * sizeof(int));
for (int i = 1; i < rows; i++)
    matrix[i] = matrix[0] + i * columns;
一次性申请全部的内存 分配连续的内存

(3) 将二维数组看做一维数组

  • int *matrix = (int *)malloc(rows * columns * sizeof(int));

将二维数组看做一维数组,开始时一次性分配全部所需要的内存,这时,无法使用数组下标,因此需要手工计算索引

for (int i = 0; i < rows; i++) {
    for (int j = 0; j < columns; j++) {
        *(matrix + (i*columns) + j) = i*j;
    }
}
将二维数组看做一维数组

matrix 现在是再普通不过的一个整数指针罢了,matrix+1就是matrix存的地址+4,每一行都有 columns个元素,那么使用 columns*i表示跨过的元素个数

相关文章

网友评论

      本文标题:[C指针]指针与数组:动态分配二维数组,使内存连续或不一定连续

      本文链接:https://www.haomeiwen.com/subject/dxqrwqtx.html