源码
1. 主要
#include <stdio.h>
#include <stdlib.h>
#define ROW (5)
#define COL (2)
int main(void){
int arr[ROW][COL] = {{1,5},{2,6},{3,7},{4,8},{5,9}};
/* 1.1 DEF int** */
int **p = (int **)malloc(sizeof(int *) * ROW);
/* 1.2 DEF int* */
for (int i=0 ; i<ROW ; ++i){
p[i] = (int *)malloc(sizeof(int)*COL);
}
/* 2. init int* */
for (int i=0 ; i<ROW ; ++i){
for (int j=0 ; j<COL ; ++j){
p[i][j] = arr[i][j];
}
}
/* 3.1 free int* */
for (int i=0 ; i<ROW ; ++i){
free(p[i]);
}
/* 3.2 free int** */
free(p);
return 0;
}
2. 全部
#include <stdio.h>
#include <stdlib.h>
#define DEBUG
#ifdef DEBUG
#include <assert.h>
#endif
#define ROW (5)
#define COL (2)
int main(void){
int arr[ROW][COL] = {{1,5},{2,6},{3,7},{4,8},{5,9}};
/* 1.1 DEF int** */
int **p = (int **)malloc(sizeof(int *) * ROW);
#ifdef DEBUG
assert(p);
#endif
/* 1.2 DEF int* */
for (int i=0 ; i<ROW ; ++i){
p[i] = (int *)malloc(sizeof(int)*COL);
#ifdef DEBUG
assert(p[i]);
#endif
}
/* 2. init int* */
for (int i=0 ; i<ROW ; ++i){
for (int j=0 ; j<COL ; ++j){
p[i][j] = arr[i][j];
}
}
#ifdef DEBUG
printf("before array : ");
for (int i=0 ; i<ROW ; ++i){
for (int j=0 ; j<COL ; ++j){
printf("%d,",arr[i][j]);
}
}
printf("\n");
printf("after pointer : ");
for (int i=0 ; i<ROW ; ++i){
for (int j=0 ; j<COL ; ++j){
printf("%d,",p[i][j]);
}
}
printf("\n");
#endif
/* 3.1 free int* */
for (int i=0 ; i<ROW ; ++i){
free(p[i]);
}
/* 3.2 free int** */
free(p);
return 0;
}
小结
- 定义指针
1.1 先定义二级指针
1.2 再定义一级指针- 初始化数据
2.1 初始化一级指针- 寻址
3.1 利用二级指针与一级指针访问数据- 释放
4.1 free()一级指针
4.2 free()二级指针
remark:
内存分布,数据大小,这也是数组为什么只能忽略第一维大小的原因。