C语言里,所有变量空间都是在程序运行之初向系zd统申请的,
包括指针,除了一些动态申请方式如malloc函数。
没有申请的空间系统是不允许读写的。那么如果一个数组大小是变量定义,则在程序运行前不能确定数组大小,也就无法申请,故不允许。所以,解决的办法便是通过malloc函数。
首先要明白,二维数组本质上也是一维的,二维只是人为想象出的空间感。
其实二维数组a[i][j]的不同之处在于,它的数组名a是一个二级指针,它直接指向一个指针数组(元素都是指针的数组),a中储存的就是该指针数组的首地址,该指针数组里存储的指针按顺序指向每一行元素的首地址。因此,该指针数组的长度,即为二维数组的行数i。
a[i](即*(a+i))访问的是指向第i行的指针,a[i][j](即*(*(a+i)+j))访问的是第i行第j列的元素。
由此我们可以知道,想要动态地初始化一个二维数组的步骤如下:
1.定义一个二级指针a(以整形为例);
2.使这个二级指针指向一个指针数组,即为a分配长为i的指针数组的地址;
3.通过对a[i]的访问,为二维数组的每行元素申请地址,申请的大小由列宽j决定;
# define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
# include <assert.h>
# include<stdlib.h>
//如果动态定义一个m行, n列的2维数组(经典面试题)
int main()
{
int m, n;//m行,n列
scanf("%d %d", &m, &n);
int** arr = (int**)malloc(m * sizeof(int*));
assert(arr != NULL);
for (int i = 0; i < m; i++)
{
arr[i] = (int*)malloc(n * sizeof(int));
}int k = 0;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
arr[i][j] = k++;//
}for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
printf("%d ", arr[i][j]);
printf("\n");
}//释放内存
for (int i = 0; i < m; i++)
free(arr[i]);
free(arr);return 0;
}