1 //========================================================
2 //创建动态二维数组a [M] [N];
3 //思路一:二维数组的抽象理解;
4 //思路二:二维数组在内存中实际排列;
5 //========================================================
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <windows.h>
9
10 //宏MIND用于选择思路;该宏定义时编译思路一,未定义时编译思路二;
11 #define MIND 1
12
13 int main()
14 {
15 //m为二维数组行数,n为列数;
16 int m,n,i,j;
17
18 printf ("请输入二维数组的行数:");
19 scanf ("%d",&m);
20 printf ("请输入二维数组的列数:");
21 scanf ("%d",&n);
22 system ("cls");
23
24 #ifndef MIND
25 //========================================================
26 //思路二;
27 //========================================================
28 printf ("思路二\n");
29
30 int *p;
31 p=(int *) calloc (m*n,sizeof(int));
32
33 //输入二维数组;
34 printf ("请输入二维数组各元素:\n");
35 for (i=0; i < m; ++i)
36 {
37 for (j=0; j < n; ++j)
38 {
39 scanf ("%d",(p+i*n+j));
40 }
41 }
42
43 //输出二维数组;
44 printf ("\n二维数组(行:%d 列:%d):\n");
45 for (i=0; i < m; ++i)
46 {
47 for (j=0; j < n; ++j)
48 {
49 printf ("%6d",*(p+i*n+j));
50 }
51 printf ("\n");
52 }
53
54 free (p);
55
56 #else
57 //========================================================
58 //思路一;
59 //========================================================
60 printf ("思路一\n");
61
62 int **p;
63
64 //申请一维动态指针数组;
65 p=(int **) calloc (m,sizeof (int *));
66
67 //申请每行的一维动态数组;
68 for (i=0; i < m; ++i)
69 {
70 *(p+i)=(int *) calloc (n,sizeof (int));
71 }
72
73 //输入二维数组;
74 printf ("请输入二维数组各元素:\n");
75 for (i=0; i < m; ++i)
76 {
77 for (j=0; j < n; ++j)
78 {
79 scanf ("%d",(*(p+i)+j));
80 }
81 }
82 printf ("\n");
83
84 //输出二维数组;
85 for (i=0; i < m; ++i)
86 {
87 for (j=0; j < n; ++j)
88 {
89 printf ("%6d",*(p [i]+j)); //此处与行指针用法一样;
90 }
91 printf ("\n");
92 }
93
94 //由里向外释放内存;
95 for (i=0; i < m; ++i)
96 {
97 free (*(p+i));
98 }
99 free (p);
100
101 #endif
102
103 system ("pause>nul");
104 return 0;
105 }