这是今天在百度知道上看到的问题,一开始感觉很简单,就感觉没有难度只是scanf,printf之类的,后来实在是无聊就想着回答一下吧,但是当我回答的时候发现这道题并不是那么简单,他需要对内存理解的很透彻的情况下才可以做出来,首先第一个难点在于他是动态的二维数组,我想了第一个解决办法是这样的
#include "stdio.h"
#include "stdlib.h"
int main()
{
int m,n,i,j;
int **a;
scanf("%d",&m);
scanf("%d",&n);
a = (int **)malloc((m + n) * sizeof(int));
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", a + i * n + j);
}
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
printf("%d ", *(a + i * n + j));
}
printf("\n");
}
system("pause");
}
后来经过思考后发现不太合适,至少不合适他说的m行n列,后来又想到了另外一个方法如下
#include "stdio.h"
#include "stdlib.h"
int main()
{
int m,n,i,j;
int **a;
scanf("%d",&m);
scanf("%d",&n);
// 申请m个指向整形指针(其实指针和数组名是一样的,只不过数组名是固定大小内存块的起始位置
// 但指针的内存大小还没有确定)的指针,也就是m行
a = (int **)malloc(m * sizeof(int *));
for (i = 0; i < m; i++)
{
// 为每一行分配n列的内存空间
a[i] = (int *)malloc(n * sizeof(int));
for (j = 0; j < n; j++)
{
scanf("%d", &a[i][j]);
}
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
printf("%d", a[i][j]);
}
printf("\n");
}
system("pause");
}