2020年1月2日13:46:26
一句话解释什么是函数指针.
函数指针
本质是个指针
,这个指针指向一个函数
.
如何声明函数指针
呢?
那我们考虑一下如何声明一个指针,如何声明一个函数,再将两者结合起来.
声明指针:
int *p;
声明函数:
int func(int a);//声明了一个返回值为int类型,参数为int的函数func
现在将两者结合起来:
int *funcpointer(int a);//按照指针的声明规则来读,应该是:这句话声明了一个int类型的指针funcpointer,这个指针指向了一个 参数为int的返回值为int的函数
现在就很明确了我们声明对了.
现在我们再来看看这个函数指针怎么使用.
在解释怎么使用之前,我们来看看常见的指针是怎么使用的.
int a = 10;
int *p = NULL;
p = &a;
上面的三句话,我们很明确,哦 原来这个指针p指向了和它同类型的内容,这里的同类型是int.
所以指针的用法是:指针应该指向一个同类型的内容(地址)
啊.
那现在我们来看看函数指针应该怎么使用.
一开始我们就说了一句话:
函数指针
本质是个指针
,这个指针指向一个函数
.这句话向我们传递的内容是:这个函数指针 应该指向一个内容或者说应该指向一个地址,而这个地址应该是一个函数的首地址.
类比数组,我们知道数组指针的这个指针应该指向一个和自己同类型的数组.这个类型就是形式上一致的,比如说数组的行数与数组里存的内容的类型.
到函数指针这里也同样是这个道理.那函数指针的同类型应该有谁呢?
我们看看函数的组成:返回值 函数名(参数列表);
可以看出,两个函数同类型说的是返回值一样,参数列表一样.这两个部分一样的函数,我们称之为同类型的函数.
那现在,我们声明了这个类型的指针.就意味着:声明的这个类型的函数指针,就应该也很合理的指向这样类型的函数
说了这么多的文字,可能要晕了.
那现在我们用代码来解释这个函数指针怎么用.
//声明一个函数
int func(int a);
//声明一个函数指针
int *funcpointer(int a);
//给函数指针赋值
funcpointer = func;
//调用
funcpointer(10);
这个使用就是简单的赋值.这里需要注意,我们使用指针的时候一般都是使用&
符号取地址,这里的函数名指向的就是函数的地址,所以这里不用&
了.
下面的调用才是使用函数指针.
这句话funcpointer(10);
和func(10);
效果是一样的,没有本质的不同.都是调用了func(10);
.
有没有一种脱裤子放屁的感觉???
上面的使用,肯定是脱裤子放屁.
真正发挥函数指针的能力的是回调函数.在了解学习回调函数之前先来看一个小问题函数指针的声明
原文:https://www.cnblogs.com/dhu121/p/12132725.html