int **matrix, i, j;
matrix = malloc(5 * sizeof(int*));
*matrix = malloc(20 * sizeof(int));
我只是不明白双指针的概念以及它如何转化为二维数组(如果它是真的) 提前致谢。
最佳答案
从技术上讲,这里创建的不是二维数组,而是指针数组,每个指针都包含数组的起始地址。然后可以将其编入索引,就好像它是“真正的”二维数组一样。
此行创建一个包含 5 个指向 int
的指针的数组:
matrix = malloc(5 * sizeof(int*));
下一行创建一个数组 20 int
:
*matrix = malloc(20 * sizeof(int));
然而,就二维数组而言,这是不完整的,因为只分配了一行。您需要遍历 matrix
指向的每个元素以创建每一行:
int **matrix, i;
matrix = malloc(5 * sizeof(int*));
for (i=0; i<5; i++) {
matrix[i] = malloc(20 * sizeof(int));
}
当您使用完这个动态二维数组后,您需要以相反的顺序释放内存:
for (i=0; i<5; i++) {
free(matrix[i]);
}
free(matrix);
这在几个方面不同于真正的二维数组。首先,在真正的二维数组中,所有元素在内存中都是连续的,而在这种情况下,指针数组和每行数组不是。
另一个区别是当被传递给一个函数时,你不能像传递一个真正的二维数组那样传递它。
对于一个简单的一维数组,无论是在编译时分配还是动态分配:
int a1[5];
int *a2 = malloc(5 * sizeof(int));
两者都可以传递给这样的函数:
void f(int *a);
但是对于二维数组:
int a[5][20];
它需要传递给这样的函数:
void f(int a[5][20]);
或等效地:
void f(int (*a)[20]);
而动态二维数组需要像这样传递给函数:
void f(int **a);
关于c - 双指针是什么意思和指针日期类型大小的malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54076643/