学习目标:
数组指针与函数指针
学习内容:
数组指针
二维数组作为函数参数,形参指向数组的指针
函数指针
malloc分配的空间一定连续
学习练习:
3.1二维数组边缘元素求和:
4 int sum2d(int (*a)[4],int rows)
5 {
6 int i = 0;
7 int j = 0;
8 int count = 0;
9 for( i = 0; i < rows;++i)
10 {
11
12 for(j = 0; j < 4;++j)
13 {
14 if(i == 0 || j ==0 || i == rows -1 ||j == 3 )
15 {
16 count += *(*(a + i) + j);
17 }
18 }
19 }
20 return count;
21
22 }
3.2开辟空间P输出斐波那契数列前十项:
60 int fib(int n)
61 {
62
63 if(1 == n || n == 2)
64 {
65 return 1;
66 }
67 else
68 {
69 return fib(n - 1) + fib( n -2);
70 }
71 }
if(p)
123 {
124 for( int i = 0;i < 10; ++i)
125 {
126 p[i] = fib(i + 1);
127 }
128 for(int i = 0;i < 10;++i)
129 {
130 printf("%d ",p[i]);
131 }
132 printf("\n");
133 }
free(p);
p = NULL;
3.3拼接空间q继续输出斐波那契数列前二十项:
134 int *q = malloc(80);
135 memcpy(q,p,40);
136 free(p);
137 p = q;
138 printf("拼接空间q继续输出斐波那契数列前二十项:");
139 if(q)
140 {
141 for( int i = 10;i < 20; ++i)
142 {
143 q[i] = fib(i + 1);
144 }
145 for(int i = 0;i < 20;++i)
146 {
147 printf("%d ",q[i]);
148 }
149 printf("\n");
150 }
151 free(p);
P = q = NULL;
3.4逆序输出二维数组:
23 void swap(int *a, int *b)
24 {
25 int temp = *a;
26 *a = *b;
27 *b = temp;
28 }
29
30 void reverse(int *begin,int *end)
31 {
32 while(begin < end)
33 {
34 swap(begin++,end--);
35 }
36 }
37 void revers2d(int (*a)[4],int rows)
38 {
39 int i ,j;
40 for(i = 0; i < rows;++i)
41 {
42 reverse(*(a+i),*(a + i) + 3);
43 }
44
45 }
46
3.5条件查询回调div5函数:
73 int div3(int a)
74 {
75 return a % 3 == 0;
76 }
77 int div5(int a)
78 {
79 return a % 5 == 0;
80 }
81
82 void printfArray(int *a,int len,int (*p)(int))
83 {
84
85 int i;
86 for( i = 0;i< len;++i)
87 {
88 if(p(a[i]) != 0)
89 {
90 printf("%d ",a[i]);
91 }
92 }
93 printf("\n");
94 }
95
3.6快速排序回调shortcmp函数:
96 int shortcmp(const void *a,const void *b)
97 {
98 short *p = (short *)a;
99 short *q = (short *)b;
100 if(*p > *q)
101 {
102 return 1;
103 }
104 else if( *p == *q)
105 {
106 return 0;
107 }
108 else
109 {
110 return -1;
111 }
112 }