創建動態二維數組,動態二維數組
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 }