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