c语言 四种方法调用数组

  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("\n");
 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("\n");
 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("\n");
 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("\n");
 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("\n方法1:\n");
 80     printf("输出a:%d\n", 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("\n方法2:\n");
 88     printf("输出a:%s\n", a);
 89     print_b(a, 5, 5);
 90 
 91     printf("\n方法3:\n");
 92     printf("输出&a[0][0]:%d\n", &a[0][0]);
 93     printf("输出&a:%d\n", &a);
 94     printf("输出a:%d\n", a);
 95     print_c(&a[0][0], 5, 5); //&a是会警告的,&a[0][0]才最好。。&a 是整个数组的首地址,a是数组首元素的首地址
 96 
 97     printf("\n方法4:\n");
 98     print_d(&a, 5, 5);//&a 是整个数组的首地址
 99 
100     getchar();
101     return 0;
102 }

c语言 四种方法调用数组