1.函数指针声明的格式及简单的使用
(1)格式:(返回值)(*函数指针名)(参数列表) 例如:声明一个无参数无返回值的函数指针(void)(*p)(void)。
(2)将函数指针指向某个无参数无返回值的函数fun();(注:fun函数我就不在这里声明了) 形如:p = fun;(注意的是:fun后面不用加括号) ,这句话就是表示将函 数指针p指向名为fun的函数。
(3)使用函数指针调用fun函数,形如:p();(等价于直接调用fun())。
所以完整的使用应该为三个步骤:1.声明 2.指向函数(必须返回值参数和被指向的函数一样)3.调用
相信这样理解起来应该还是蛮容易的,可能有人要问,既然声明函数指针调用函数和直接调用函数达到的效果一样,那干嘛要用函数指针呢,不是 多此一举吗???好吧,我开始也这样认为,看一下下面的例子吧(也很简单,毕竟水平有限啊。。啊。。。啊)
2.函数指针简单的理解和认识
void (*p)(void);
int num;
while (1) {
scanf("%d", &num);
if (num == 1) {
p = func1;
}else if(num == 2){
p = func2;
}else
break;
p();
}
这个简单的小例子,根据你输入的数字是1还是2,来决定调用哪个函数,输入1,调用fun1(),输入2,调用fun2().相信大家也能看出来。
我只声明了一个函数指针p,通过输入的不同,来决定p函数指针是指向fun1还是fun2,最后通过只调用p(),来达到调用函数的结果。
3.函数指针的简单的应用
1.其实看完上面的小例子,大家应该还没感觉到函数指针的好处,毕竟直接调用fun1和fun2也是很容易的。
下面分享一个函数指针在排序中的应用,通过传入的排序方式不同,从而对数组元素进行排序。(代码是用OC语法写的,还是很容易懂的~~~)
NSArray* sort(NSArray *array,NSInteger(*p)(id obj1,id obj2))
{
NSMutableArray *arr = [NSMutableArray arrayWithArray:array];
NSInteger len = [arr count];
for (int i = 0 ; i < len-1; i++)
{
for (int j = 0; j < len -i -1; j++)
{
if(p(arr[j],arr[j+1]))//函数指针的调用
{
[arr exchangeObjectAtIndex:j withObjectAtIndex:j+1];
}
}
}
return arr;
}
NSInteger valueSort(id obj1,id obj2)//根据值排序
{
if([obj1 intValue]>[obj2 intValue])
{
return 1;
}
return 0;
}
NSInteger asciiSort(id obj1,id obj2)//根据ASCII码排序
{
if([obj1 compare:obj2] == 1)
{
return 1;
}
return 0;
}
NSInteger lengthSort(id obj1,id obj2)//根据字符串长度排序
{
if([obj1 length]>[obj2 length])
{
return 1;
}
return 0;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSArray *array = @[@"91111",@"22",@"333",@"55"];
NSArray *arr = sort(array, valueSort);
//NSArray *arr = sort(array, asciiSort);
//NSArray *arr = sort(array, lengthSort);
for (int i = 0; i<[arr count]; i++)
{
NSLog(@"%@",arr[i]);
}
}
return 0;
}
例子很简单,个人觉得函数指针在代码的重构应该起着一定的作用,试想如果将sort函数封装起来,以后每次我们自己需要自定义方法来实现某种排序,只要写一个自己的方法就行,通过函数指针传入到封装的代码中,实现自定义功能,这样也是很不错的嘛,至少省下了很多重复的代码~~~(其实OC中的block我觉得很函数指针就是非常类似的😄好吧,下次写一下自己对block的理解!嘻嘻)