立即学习:https://edu.youkuaiyun.com/course/play/8088/176833?utm_source=blogtoedu
1. 用函数指针变量调用函数
一个函数在编译的时候系统会给这个函数分配一个入口地址,这个入口地址就称为函数的指针
int (*p)(int x,int y); //定义一个函数指针变量,定义参数,定义返回值;*p两侧括号不可省略,表*和p先结合代表一个指针变量,然后再和后边的()结合表示此指针变量指向函数;
p = max; //将函数max的入口地址赋给指针变量p,函数名代表该函数的入口地址。p就是指向函数max的指针变量,p和max都指向函数的开头;写成p =&max;也可以
调试时发现p和max值不等:vs等等有一些内部处理手段:把max等很多这种函数的入口地址保存成一张表格,函数调用的时候系统会到这张表格里取真实的函数入口地址然后再调用函数,所以看到max和p值不同。p里边保存的是真正的函数入口地址,max里存的是表格里边一个对应关系地址,通过max这里的地址我们可以找到真正的函数入口地址。
总结:
(1)函数指针变量定义的一般形式:
数据类型标识符 (*指针变量名) (形参列表);
其中“数据类型标识符”是指函数的返回值类型。“形参列表”里可以只有类型说明符,多个类型说明符之间用逗号分隔;
(2)函数的调用,可以通过函数名调用,也可以通过函数指针调用。
(3)对指向函数的指针变量p,做一些像p++,p--,p+n等运算都不可以,也无意义;
2. 把指向函数的指针变量作为函数的参数
int max(int x,int y)
{
if(x > y)
return x;
return y;
}
int wwmax(int x,int y,int (*midfunc)(int ,int))
{
int result = midfunc(x,y);
return result;
}
int main() //主函数
{
int c;
c = wwmax(5,19,max); //直接把函数名max传进去
printf("c=%d\n",c);
int (*p)(int ,int);
p = max;
c = wwmax(45,21,p); //使用指向max函数的指针传递
printf("c=%d\n",c);
}
3. 返回指针值的函数
返回指针值的函数的一般定义形式为:
数据类型 *函数名(参数列表)
例如: int *a(int x, int y)
a作为函数名,()优先级高于*,因此a先与()结合,这是函数形式,返回值为指针形式。
int* add(int x, int y)
{
int sum = x + y;
return ∑//隐藏致命问题,函数调用完毕后,这个内存地址 会被系统回收;
}
int main() //主函数
{
int *presult;
presult = add(4,5); //执行后presult指向的内容有已经不归你所有,你不应该从中取得值或者给他赋值,解决方法为将sum定义为全局变量
printf("result = %d\n", *presult);
}