#include<stdio.h>
#include<stdlib.h>
// 1 为行地址分配内存 即二级指针
// 2 为每行分配一片内存,
// 3 释放内存
//记得释放内存
void main()
{
printf("动态非连续二维数组,可随意填写行和列,\n");
int x, y;
scanf_s("%d%d", &x, &y); //设置行和列
//二级指针可以存放指针数组的地址
//动态分配一片内存,用来存放指针数组,每一个元素都是一个地址,这里的地址是行地址
//然后将指针数组的地址传递给pp保存
int **pp =(int **) malloc(sizeof(int *)*x); //分配内存 并且转换成int**类型
// 注意这里是 sizeof(int *)*x 代表存放行地址
//下面使pp保存的地址进行赋值 对应每行的地址 行即一维数组 所以上面的才是 sizeof(int *)*x
for (int i = 0; i < x; i++)
{
pp[i] = malloc(sizeof(int)*y); // 分配每行sizeof(int)*y大小的内存
// 并且将每行的首地址传递给pp[i]
}
int num = 0;
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
pp[i][j] = num++;
printf("%4d", pp[i][j]);
}
printf("\n");
}
for (int i = 0; i < x; i++)
{
free(pp[i]);
}
free(pp);
getchar();
getchar();
}