#include
#include // 申请动态内存需要的头文件
int main()
{
int n1, n2, i, j;
printf("输入行数");
scanf("%d", &n1);
getchar();
printf("输入列数");
scanf("%d", &n2);
getchar();
int *arr; //定义一个二级指针用来接收下面 malloc分配的(sizeof(int *) * n1) 个内存空间的首地址。
arr= (int *) malloc(sizeof(int) * (n1*n2));// 一次性分配n1*n2个内存单元 满足你说的内存连续(注意这里是指虚拟地址哦,不是物理地址)
printf("下面为数组每个元素赋值\n");
for(i = 0; i < n1; i++)
{
for(j = 0; j < n2; j++)
{
printf("输入%d行 第%d个元素的值", i+1, j+1);
scanf("%d", arr+i*n2+j);
}
}
printf("二维数组中的值:\n");
for(i = 0; i < n1; i++)
{
for(j = 0; j < n2; j++)
{
printf("%d\t", *(arr+i*n2+j));
}
putchar('\n');
}
}
/*
建议用电脑看我的回答。
运行结果:
输入行数3
输入列数3
下面为数组每个元素赋值
输入1行 第1个元素的值1
输入1行 第2个元素的值2
输入1行 第3个元素的值3
输入2行 第1个元素的值4
输入2行 第2个元素的值5
输入2行 第3个元素的值6
输入3行 第1个元素的值7
输入3行 第2个元素的值8
输入3行 第3个元素的值9
二维数组中的值:
1 2 3
4 5 6
7 8 9
Press any key to continue
总结:其实就是利用了malloc在内存堆中分配内存。在程序23行 scanf("%d", arr+i*n2+j); 语句中 方
向没有我们利用了n2这值也就是二维数组的’列数‘ 这么做也就是为了 像你说的内存连续。
可是malloc分配的其实是虚拟内存,其实是不连续的。只是逻辑上的连续。物理地址不连续。就像链表。
要是有不对的地方请指出。。。。
就当复习了
^_^
*/