方法一: 二级指针
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,j;
int row = 4,col = 5;
//申请一个 4行 5列的二维数组
int **ar = (int**)malloc(sizeof(int*) * row); //sizeof(int*),不能少*,一个指针的内存大小,每个元素是一个指针。
for (i = 0;i < row;i++)
{
ar[i] = (int*)malloc(sizeof(int) * col);
}
for (i = 0;i < row;i++)
{
for (j = 0;j < col;j++)
{
printf("%p ",&ar[i][j]);
}
printf("\n");
}
for (i = 0;i < row;i++)
free(ar[i]);
free(ar);
return 0;
}
运行结果 可见地址是连续的,且int大小为4个字节
方法二: 数组指针
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,j;
int row = 4,col = 5;
//申请一个 4行 5列的二维数组
int (*ar)[col] = (int(*)[col])malloc(sizeof(int) * row * col); //(*ar) 括号不能少,[]优先级高,少了就是指针数组了
for (i = 0;i < row;i++)
{
for (j = 0;j < col;j++)
{
printf("%p ",&ar[i][j]);
}
printf("\n");
}
free(ar);
return 0;
}
运行结果
方法三: 一维数组模拟二维数组
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,j;
int row = 4,col = 5;
//申请一个 4行 5列的二维数组
int *ar =(int*)malloc(sizeof(int) * row * col);
for (i = 0;i < row;i++)
{
for (j = 0;j < col;j++)
{
printf("%p ",&ar[i * col + j]);
}
printf("\n");
}
free(ar);
return 0;
}
运行结果
方法四: 用结构体,每个结构体定义 col个元素的一维数组,不过这样用不方便且繁琐。
typedef struct {
int a[5];
}item;
item *ar = (item*)malloc(sizeof(item) * 4);
总结:几种方法都可以动态的申请二维数组,但就我做题来看,几乎用的全是第一种和第二种方法。如果以指针为参数传递给一个函数一个二维数组要用方法一,方法二会报错。不过方法二简洁,只需要一行代码。malloc内存用完后记得要free释放哦
谢谢。