你的位置:首页 > 操作系统

[操作系统]谈谈自己对C语言中函数指针的一些理解 (第一次写博客,有点小兴奋哈)


最近因为在学ios,所以重新拾起了C语言,看了一些知识,看到函数指针的概念时,反正是忘记差不多了。。。所以看完想写一下自己的理解和看法吧,希望各位大神能够多指点一下,毕竟自我感觉我的理解也是很浅的。

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的理解!嘻嘻)