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 }
时间: 2024-08-27 22:48:17