返回指针值的函数
1 返回值为指针型数据的函数,定义一般的形式为:
类型名 *函数名(参数表)
例如:int* func(int x, int y);
解释:表示func的返回值为指向int型数据的指针。
注意点:函数名前的*只表示范围值为指针型数据
*func两侧没有括号。
返回指针值的函数的例子与调试呢,我就不写了,因为我觉得这个还是非常简单的了。我重点写下面的知识点,指向函数的指针。
指向函数的指针
为什么会存在指向函数的指针:因为啊!函数作为一段程序,在内存中也要占据一片存储区域呢!它就会有一个起始地址,即函数的入口地址,这个就好像世界地图,每个国家对就像世界地图上的1块空间,如果从1个固定的地方往1个方向看,每个国家都会有1个地方是离你最近的,这个最近的地方就好比函数的入口地址,也就是它的起始地址啦!这个地址我们就叫它函数的指针。
指向函数的指针有什么作用啊:这样一来啊,我们就可以定义一个指针变量指向函数,然后通过指针调用函数。将函数作为参数在函数间传递。
使用指向函数的指针会给程序带来什么好处啊?:我暂时还不知道,继续往下学,说不定就知道啦!
既然函数有1个入口,那么函数有多少个出口啊?出口就看return啦!有多少个return就有多少个出口哦!
指向函数的指针变量定义:类型名 (* 指针变量名) ();
指向函数的指针的更深入一层去理解:因为编译器会把函数翻译出所对于的机器代码,那么这个机器代码的第一个字节的地址就是函数的 首地址,也就是指向函数的指针。
间接调用与直接调用:通过函数指针来调用函数叫间接调用,通过函数名来调用叫直接调用。
例子:
int (*p)()
表示:p是一个指向函数的指针变量,此函数的返回值为int型。
代码事例:
大家看了这段代码是不是发现了1个问题啊p和Max并不相等啊,这个是为什么啊?!当然只有加油去搜寻资料了!。。。。。。10分钟后!原来是这样的,大家看这个:
哦!我们明白啦!在401005这里有个jmp跳转。原来函数指针被归纳在一个跳表里去啦!但是这个只是在debug方式下会这样做哦!
我们再来看一段代码:
#include
<
stdio.h
>
int
Max(
int
x,
int
y){
return
x
>
y
?
x:y;}
void
main(){
int
a;
int
(
*
p)(
int
)
=
NULL; p
=
(
int
(
*
)(
int
))Max;//其中int(*)(int)这段呢!是一个数据类型,表示一个单参函数的指针,作用是把1个
双参函数的地址强制说成是1个单参函数的地址。 a
=
((
int
(
*
)(
int
,
int
))p)(
2
,
9
);//然后我们调用时候不行啊,因为参数不对,所以又要转换回来!}
哇!函数指针的类型转换好郁闷啊!但是我必须要学懂!以后肯定会遇到的!
注意:由于这类指针变量等于一个函数的入口地址,所以它们做加减运算是无意义的。(嘿嘿!这句话又像谭老师!虽然我没有看过他的书!但是我觉得呢!这些结论只是我暂时的理解!以后可能会有新的认识的!加油!!!)
逻辑与算法分离
大家看:这样一来我们的算法和逻辑分开啦!这样的话,我们想换算法,换参数就可以啦!我们把算法给参数化了!
这一节笔记就写到这里了!大家一起加油!学习知识,让生活更美好!