函数指针和回调函数的使用.充分体会到了指针的灵活性.
主要是掌握以下几点:1.看懂语法
2.会定义指向函数的指针,(*p)是函数指针的固定写法,小括号必不可少,函数返回值类型+(*p)+(形参)
3.掌握如何利用指针调用函数,有两种方法 1> p(); 2>(*p)();
4.会使用回调函数,用函数指针作为函数的参数,实现需求不稳定时候,程序修改起来更加便捷
例如如下的程序中第1题,如果想改变一下程序要求,将5的倍数变为0输出,可将函数指针重指向给change_3就好了,第2题如果想输出数组A的值都小于B,则将函数指针指向change_4,不需要其他修改.函数回调非常适用于被调用的函数不确定的情况.比如某些条件下指向函数A,某些情况指向函数B.又比如说动态排序.总而言之,函数指针和函数回调使程序非常灵活.
#import <Foundation/Foundation.h>
#import "Function.h"
int change_1(int a){
return (a%3) ==0 ?0: a;
}//3的倍数替换为0
int change_3(int a){
return (a%5) ==0 ? 0: a;
}//5的倍数替换为0
void printArray(int a[],int count,CHANGE_1 p){
for (int i =0; i < count; i++) {
a[i] = p(a[i]);
printf("%-3d ",a[i]);
}
}
void change_2(int *p1,int *p2){
if (*p1 > *p2) {
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
}//保证前者<后者
void change_4(int *p1,int *p2){
if (*p1 < *p2) {
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
}
void printAB(int a[],int b[],int count,CHANGE_2 p){
for (int i =0; i < count; i++) {
p(&a[i], &b[i]);
}
for (int i =0 ; i < count; i++) {
printf("a[%d]:%d\t",i,a[i]);
printf("b[%d]:%d\t",i,b[i]);
printf("\n");
}
}
int main(int argc,constchar * argv[])
{//1.(***)随机生成一个 10个元素的数组,找到 3的倍数,并将其值修改成 0.(注意:修改数值使用回掉函数处理)
int a[10] = {0};
printf("处理前数组:\n");
for (int i =0; i < 10 ; i++) {
a[i] =arc4random_uniform(101);
printf("%-3d ",a[i]);
}
printf("\n处理后数组:\n");
CHANGE_1 p = change_1;
int count = sizeof(a)/sizeof(int);
printArray(a, count, p);
printf("\n================================\n");
//2. (***)有两个10个元素的数组,分别为A和B,编程实现相同位置的元素,如果 B 的元素小于 A的元素进行数值交换:(使用回调函数实现)
int A[10] = {0};
int B[10] = {0};
printf("原始数组:\n");
for (int i =0; i < 10 ; i++) {
A[i] =arc4random_uniform(101);
printf("a[%d]:%-3d\t",i,A[i]);
B[i] =arc4random_uniform(101);
printf("b[%d]:%-3d\t",i,B[i]);
printf("\n");
}
printf("\n改变后数组:\n");
CHANGE_2 P = change_2;
printAB(A, B, 10, P);
return 0;
}
运行结果: