1 #include <stdio.h> 2 /********************************* 3 * 方法1: 第一维的长度可以不指定 * 4 * 但必须指定第二维的长度 * 5 *********************************/ 6 void print_a(double a[][5], int n, int m) 7 { 8 int i, j; 9 10 for (i = 0; i < n; i++) 11 { 12 for (j = 0; j < m; j++) 13 { 14 printf("%lf ", a[i][j]); 15 } 16 17 printf(" "); 18 } 19 //printf("%d ", a[1][0]+a[2][0]);//输出3+6, 20 //a[4][4]=a[1][0]+a[2][0]; //即验证是不是真能直接操作数组,答案是可以 21 } 22 /************************************************************** 23 *方法2: int (*a)[5]是指向一个一维数组(有5个int型元素)的指针, 24 *因为原数组每行有5个元素,故int (*a)[5]中必须为5 25 *而*a[N]是一个指针数组,也就是一个数组,里面有N个指针 26 *而(*a)[N]是一个指向数组的指针,也就是一个指针,指向一个含有N个元素的数组 27 **************************************************************/ 28 void print_b(double(*a)[5], int n, int m) 29 { 30 int i, j; 31 32 for (i = 0; i < n; i++) 33 { 34 for (j = 0; j < m; j++) 35 printf("%lf ", a[i][j]); 36 37 printf(" "); 38 } 39 } 40 /*********************************** 41 *方法3: 利用数组是顺序存储的特性, 42 * 通过降维来访问原数组! 43 ***********************************/ 44 void print_c(double *a, int n, int m) 45 { 46 int i, j; 47 48 for (i = 0; i < n; i++) 49 { 50 for (j = 0; j < m; j++) 51 printf("%lf ", *(a + i*m + j)); //指针的偏移 52 53 printf(" "); 54 } 55 } 56 57 /*********************************** 58 *方法4: 利用数组指针(指向数组的指针)来访问数组,这个数 59 组指针double (*a)[5][5]存放的是其所指向的数组的首地址,注意不是数组首元素的首地址 60 * 通过降维来访问原数组! 61 ***********************************/ 62 void print_d(double(*a)[5][5], int n, int m) 63 { 64 int i, j; 65 66 for (i = 0; i < n; i++) 67 { 68 for (j = 0; j < m; j++) 69 printf("%lf ", (*a)[i][j]); 70 71 printf(" "); 72 } 73 } 74 75 int main(void) 76 { 77 double a[5][5] = { { 1.0, 2.0 }, { 3.0, 4.0, 5.0 }, { 6.0 }, { 7.0 }, { 0.0, 8.0 } }; 78 79 printf(" 方法1: "); 80 printf("输出a:%d ", a); 81 print_a(a, 5, 5);// a double (*)[1] 82 printf("%lf ", a[1][0] + a[2][0]);//输出3+6, 83 84 85 86 87 printf(" 方法2: "); 88 printf("输出a:%s ", a); 89 print_b(a, 5, 5); 90 91 printf(" 方法3: "); 92 printf("输出&a[0][0]:%d ", &a[0][0]); 93 printf("输出&a:%d ", &a); 94 printf("输出a:%d ", a); 95 print_c(&a[0][0], 5, 5); //&a是会警告的,&a[0][0]才最好。。&a 是整个数组的首地址,a是数组首元素的首地址 96 97 printf(" 方法4: "); 98 print_d(&a, 5, 5);//&a 是整个数组的首地址 99 100 getchar(); 101 return 0; 102 }