第一种办法:用指针数组;首先看一下原理图(以开辟整型二维数组三行四列为例,以下都是):
先看一下用malloc申请一维数组:
int *p=(int *)malloc(10*sizeof(int));//开辟10个内存空间
1.首先申请三个指针数组(不是数组指针)int *,既然是指针数组,存放的都是指针,那么我们就可以在此基础上继续开辟4个内存空间。
代码如下:
int main()
{
int** p = (int **)malloc(3*sizeof(int*));//申请指针数组
for(int i=0; i<3; i++)
{
p[i] = (int*)malloc(4*sizeof(int));//再申请4个内存空间
}
for(int i=0; i<3; i++)
{
for(int j=0; j<4; j++)
{
printf("%p\n", &p[i][j]);//这里根据自己的要求赋值或者打印,赋值和二维数组赋值一样
}
}
for(int i=0; i<3; i++)
{
free(p[i]);//记住要释放内存
}
free(p);//释放两次,两次释放的不一样
return 0;
}
注意:这种方法每一行元素地址连续,但是不能保证上一行的尾和下一行的开头连续
第二种办法:用数组指针 ;同样先看原理图:
看代码会更明白一点:
int main()
{
int (*p)[4] = (int(*)[4])malloc(3*4*sizeof(int));
for(int i=0; i<3; i++)
{
for(int j=0; j<4; j++)
{
printf("%p\n", &p[i][j]);
}
}
free(p);
return 0;
}
首先得明白什么是int (*p)[4],才能看的懂,不懂得可以去网上搜查一下。
第三种办法:用二维数组的思想去管理申请的一维数组
这里不用管为什么那个格子是黑的,把它当作是白的就行。
int main()
{
int *p = (int*)malloc(3*4*sizeof(int));//malloc申请12个内存块
for(int i=0; i<3; i++)
{
for(int j=0; j<4; j++)
{
p[i*4+j] = 1;//注意这里的i*4+j,
printf("%p\n", &p[i*4+j]);
}
}
free(p);
return 0;
}
我们想把第1行第2列的格子的值变为4,也就是6号下标,仔细体会i*4+j,将i=1,j=2代入,正好得到6,也就是6号下标的格子。