c语言 四种方法调用数组
1 #include <>
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 }