对于二级指针是否是二维数组动态分配定义的关键的疑问

在c语言中关于是否可以用二级指针来动态定义二维数组,一直以来众说纷纭,
是否可以将其理解为散列表?
欢迎大佬给新人一点解释:

#include
#include
#include
typedef struct _array {                      //二级指针用来定义二维数组,其实不是真正的二维数组,我的理解是类似散列表的东西
	int **array;                            //int a=0;
	int m;                              //int *p=&a;p--->a
	int n;                             // int **q=&p; q---->p---->a

}array;

void creat_array(array *a, int m, int n);
void set_array(array *a);
void free_array(array *a);
void print_array(array *a);
int main()
{
	int m;
	int n;
	printf("请输入行数:");
	scanf_s("%d", &m);
	printf("请输入列数:");
	scanf_s("%d", &n);
	array a;
	creat_array(&a, m, n);
	set_array(&a);
	print_array(&a);
	free_array(&a);

	return 0;
}
void creat_array(array *a, int m, int n) {
	int i;
	a->array = (int**)malloc(m * sizeof(int*));//注意!!!!二级指针申请空间,每一个代表一行。
	for (i = 0; i < m; i++)
	{
		a->array[i] = (int*)malloc(n * sizeof(int));//此处不太确定,a->array[i]是a->array的一个单元还是一个数组的起始地址???
	}
	a->m = m;
	a->n = n;

}
void set_array(array *a) {
	int i = 0;
	int j = 0;
	printf("请输入数据(%dx%d):", a->m, a->n);
	for (i = 0; i < a->m; i++)
	{
		for (j = 0; j < a->n; j++)
		{
			scanf_s("%d", &a->array[i][j]);
		}
	}
}
void free_array(array *a) {
	int i;
	for (i = 0; i < a->m; i++)
	{
		free(a->array[i]);//逐行释放空间
	}
	free(a->array);
	a->array = NULL;
	a->m = 0;
	a->n = 0;
}
void print_array(array *a) {
	int i, j;
	for (i = 0; i < a->m; i++) {
		for (j = 0; j < a->n; j++)
		{
			printf("%d ", a->array[i][j]);
		}
		printf("\n");
	}
}

输出的确是二维数组的形式,但在内存中的状态是否是多维数组形式,还是散列表的形式,还是不太清楚,请求指导

你可能感兴趣的:(对于二级指针是否是二维数组动态分配定义的关键的疑问)