学习笔记
《深入理解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));
}
![](https://img.haomeiwen.com/i10191360/d1b48dfe841c5802.png)
![](https://img.haomeiwen.com/i10191360/c58ff8029e116c53.png)
(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;
![](https://img.haomeiwen.com/i10191360/3f7fa06690d7b293.png)
![](https://img.haomeiwen.com/i10191360/4526a34c458373e9.png)
(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;
}
}
![](https://img.haomeiwen.com/i10191360/f1d03e82492888f0.png)
matrix
现在是再普通不过的一个整数指针罢了,matrix+1
就是matrix存的地址+4
,每一行都有columns
个元素,那么使用columns*i
表示跨过的元素个数
网友评论