函数指针
今天准备和大家讲解一下我们C语言编程的函数指针,为什么函数也需要指针呢?我是这样理解的函数指针方便我们对函数的调用,当我们需要把一个函数作为参数传给其他参数的时候就必须使用函数指针才能很好的完成。我希望今天能够很清楚很详细地和大家分享一下函数指针这一块的重点和难点。看完之后你会对函数指针的理解、定义、使用有一个比较全面的认识,废话不多说我们进入正题。
我们先来看下面的代码:
1 int * fun1 (int *ptr1, int *ptr2);
2 int * *fun2 (int *ptr1, int *ptr2);
3 int *(*fun3)(int *ptr1, int *ptr2);
在这里定义1、2、3个表达式,首先看到比较复杂的表达式不要慌,不要对它产生畏惧,我们先来一个一个分析。
第1个定义是什么意思?fun3是我们的函数名字没什么问题吧,括号里面是fun3的参数,类型都是int 行指针,和今天讲的没什么关系,括号都可以不用看,最后我们看最前面的int * 是什么意思?那不就是函数的返回值嘛,返回的是一个整型的指针。
第2个定义我们看看和第1个定义有什么区别?是不是比第1个定义多了一个 * 号那其他和第一个是一样的呀,只是返回值是一个指针的指针,是一个二级指针。
第3个定义就是我们今天的重点内容,打起精神了,精彩来啦!如果我们把第3个表达式的(*fun3)看作一个整体的话你发现他和第一表达式 int * fun1 (int *ptr1, int *ptr2);没有什么区别了?那它就是返回值为整型指针,参数为两个整型的指针对吧?好我们现在回过头来分析(*fun3)是什么东西,我们先看一个比较好理解的:*ptr 看到没有?是不是很类似,我们都知道ptr是一个指针对吧,那我们的 *fun3 和它一样也是一样指针,然后再看: int *ptr ; ptr是不是变成了一个整型指针?为什么是整型呢?原来他前面是int类型的对吧都理解那就对了我们来完整地分析第3个定义:
int *(*fun3)(int *ptr1, int *ptr2);
首先我们知道这是一个函数:
函数的返回值:int * 一个整型指针;
函数参数:int *ptr1,int*ptr2 两个整型指针;
(*fun3)是一指针;
总结:此时fun3不是一个普通的函数名了而是一个指针变量,是一个指向函数的指针;
函数指针的用法
#include<string.h>
#include<stdlib.h>
int * fun(int a ,int b)
{
if(a>b)
printf("a比b大!!\n");
else
printf("a比b小!!\n");
}
void max(int * (fun1)(int a,int b),int c,int d)
{
printf("max函数里面调用的\n");
fun1(c,d);
}
int main()
{
int a=10;
int b=20;
int *(*fun1)(int a, int b);
fun1=&fun;
printf("fun函数正常调用的\n");
fun(a,b);
printf("函数指针调用的\n");
(*fun1)(a,b);
max(fun1,a,b);
return 0;
}
代码和结果分析:
我们可以看一下三种fun函数的调用都成功了第一种的话是普通的调用给她传参数就可以了,第二个是函数指针的调用把fun的地址赋值给了函数指针fun1,然后调用也没问题,重点是第三个用法,我们把函数fun当做一个参数传到了函数max里面去了,也可以实现对函数fun的调用,这意义太大了,这也是函数指针的魅力所在。为什么呢?你想想如果我们有很多类似的函数十几个二十几个的时候我们怎么管理和使用,这时候我们可以用函数指针去管理和调用他们,把他们都装进一个函数指针数组,当然如果你够强你可以在定义一样指针指向这个数组。
在这里提一下我们的函数指针数组和函数指针数组指针:
函数指针数组:
int * (*fun[5])(int *p,int *p2)
函数指针数组指针
int * (*(fun)[5])(int *p,int *p2);
后期准写两篇专门来介绍这两种,想在评论区听一下各位对这两个知识点的看法总结一下理清楚思路再写,评论区交给大佬了!
感觉写的有些废头发,不知道你们看完知道什么是函数指针没有?