/*随着开发规模增大,有可能出现各公司的定义函数重名, OC建议为函数名增加公司前缀,如NSLog 该函数就再前面增加了NS前缀。
C语言指针是十分灵活的, 接下来将学到一些指针的高级内容。*/
函数指针变量的语法格式为:
函数返回值类型(* 指针变量名)();
//指向函数的指针变量 用法回顾
#import <Foundation/Foundation.h>
int max(int* data,int len)
{
int max= *data;
//保证max始终存储较大的值;
for(int* p=data;p<data+len;p++)
{
if(*p>max)
max=*p;
}
return max;
}
int average(int *data,int len)
{
int sum=0;
for(int* p =data;p<data+len;p++)
{
sum+=*p;
}
return sum;
}
int main(int argc, const char * argv[])
{
@autoreleasepool
{ int data[]={20,12,8,36,93,25};
//定义指向函数的指针变量:fnPt, 并将max函数的入口赋给fnPt
int(*fnPt)();
fnPt=max;
NSLog(@"最大值:%d",(*fnPt)(data,5));
//将avg函数的入口赋给fnPt
fnPt=average;
NSLog(@"平均值:%d",(*fnPt)(data,5));
}
return 0;
}
那么,就需要在函数中定义函数参数,调用该函数时传入不同的函数作为参数,即可动态改变这段代码;
例如以下代码:
#import <Foundation/Foundation.h>
void map(int* data,int len, int(*fn)())
{
//采用指针遍历data数组元素
for(int* p=data;p<data+len;p++)
{
printf("%d,",(*fn)(*p));//关键步骤 调用fn函数(fn函数是动态传入的)
}
}
int noChange(int val)
{
return val;
}
int square(int val)
{
return val*val;
}
int cube(int val)
{
return val*val*val;
}
int main(int argc, const char * argv[])
{
@autoreleasepool
{ int data[]={20,12,8,36,24};
NSLog(@"\n数组元素:");
map(data,5,noChange);
NSLog(@"\n计算数组元素平方:");
map(data,5,square);
NSLog(@"\n计算数组元素立方:");
map(data, 5, cube);
}
return 0;
}