思考:
二维数组与指针之间有什么关系?我们可以如何利用指针去访问二维数组?
代码语言:javascript复制//假设创建了一个二维数组arr[3][5]
//我们一般按照如下方式访问数组
int i = 0;
for (i = 0; i < 3; i )
{
int j = 0;
for (j = 0; j < 5; j )
{
arr[i][j] = 1;// 1
//但是此处我们也可以利用指针进行访问
*(*(arr i) j) = 1;// 2
}
}
事实上,arr[i][j]=*(*(arr i) j) .
那么我们又可以如何使用malloc函数来模拟开辟一个二维数组?
1.利用指针数组
先创建一个存放3个指针的数组,再通过数组中存放的指针分别找到对应开辟的5个整型大小的空间,但是这种方法无法确保二维数组中每一行的空间是连续的,并且最后利用free进行内存释放时也比较麻烦。
代码语言:javascript复制int main()
{
int** p = (int**)malloc(sizeof(int*) * 3);// 3行
int i = 0;
if (p != NULL)//使用前验证
{
for (i = 0; i < 3; i )
{
*(p i) = (int*)malloc(sizeof(int) * 5);// 5列
}
for (i = 0; i < 3; i )
{
int j = 0;
for (j = 0; j < 5; j )
{
scanf("%d", &p[i][j]);
}
}
for (i = 0; i < 3; i )
{
int j = 0;
for (j = 0; j < 5; j )
{
printf("%d ", p[i][j]);
}
printf("n");
}
}
for (i = 0; i < 3; i )
{
free(p[i]);//必须释放
}
free(p);
p = NULL;
return 0;
}
2.利用数组指针
对于二维数组来说,第一行的地址类型就是数组指针类型int(*)[5]。
代码语言:javascript复制int main()
{
int(*p)[5] = (int(*)[5])malloc(3 * 5 * sizeof(int));
for (int i = 0; i < 3; i )
{
for (int j = 0; i < 5; j )
{
p[i][j] = 1;
}
}
free(p);
return 0;
}