原文链接:https://blog.csdn.net/fengxinlinux/article/details/51541003
方法一:利用二级指针申请一个二维数组。
#include <stdio.h>
#include <stdlib.h> //malloc
int main()
{
int **arr; //二级指针动态申请二维数组
int m, n; //m行n列
scanf("%d%d", &m, &n);
arr = (int **)malloc(sizeof(int *) * m);
for(int i = 0; i < m; i++)
arr[i] = (int *)malloc(sizeof(int) * n);
//to do something...
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
printf("%p ", &arr[i][j]);
printf("\n");
}
for(int i = 0; i < m; i++)//先释放内部的一维数组
free(arr[i]);
free(arr); //最后释放外层的二维指针,释放完成可以将指针指向NULL,即 a = NULL;
return 0;
}
3行4列的输出结果:可以看出每一行之间的元素的地址是连续的,行与行之间不连续。
方法二:用数组指针形式申请一个二维数组。
#include <stdio.h>
#include <stdlib.h> //malloc
int main()
{
int i, j;
int (*arr)[2] = (int (*)[2])malloc(sizeof(int) * 3 * 2);//3行2列
//to do something...
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 2; j++)
printf("%p ", &arr[i][j]);//输出数组每个元素地址,每个元素的地址是连续的
printf("\n");
}
free(arr); //释放完成可以将指针指向NULL,即 a = NULL;
return 0;
}
3行2列的输出结果:可以看出每一行之间的元素的地址是连续的,行与行之间连续。
方法三:用一个单独的一维数组来模拟二维数组。
#include <stdio.h>
#include <stdlib.h> //malloc
int main()
{
int nrows, ncolumns;
int *arr;
int i, j;
scanf("%d%d", &nrows, &ncolumns);
arr = (int *)malloc(sizeof(int) * nrows * ncolumns);
//to do something...
for(int i = 0; i < nrows; i++)
{
for(int j = 0; j < ncolumns; j++)
{
arr[i * ncolumns + j] = i;
printf("%p ", arr[i * ncolumns + j]);//用arr[i * ncolumns + j]访问arr(i, j)
}
printf("\n");
}
free(arr); //释放完成可以将指针指向NULL,即 a = NULL;
return 0;
}
原文链接:https://blog.csdn.net/fengxinlinux/article/details/51541003