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 }