在c语言中关于是否可以用二级指针来动态定义二维数组,一直以来众说纷纭,
是否可以将其理解为散列表?
欢迎大佬给新人一点解释:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
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");
}
}
输出的确是二维数组的形式,但在内存中的状态是否是多维数组形式,还是散列表的形式,还是不太清楚,请求指导