指针进阶篇——函数指针
一、理解函数指针
1.什么是函数指针
我们都知道指针是利用地址,它的值直接指向存在电脑存储器中的另一个地方的值。因为指针存储的值是一块内存地址,而函数也是存在内存某个地方,所以,当一个指针指向的内存地址是一个函数的话,这种指针就是函数指针。
当我们试着打印一下函数地址,让我们观看一下结果:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int max(int x, int y)
{
return x > y ? x : y;
}
int main()
{
printf("%p\n", max);
printf("%p\n", &max);
return 0;
}
结果如图:
所以我们得出结论:函数是有地址的,并且函数的函数名就是函数的地址。
2.定义函数指针
当我们搞清楚了函数的地址,那么我们来看一下定义函数指针:
首先,我们要明白函数的三大要素:函数名、函数参数、函数的返回类型,函数指针是一个指针,所以当我们定义是名字要与结合,因为在c语言中[]优先级高于,所以我们要用(*p)来解决,然后,后面跟上函数的参数类型,我们那的max函数两个参数类型为:int x,int y,所以我们则写为(*p)(int ,int ),因为此函数返回类型为int,所以我们可写为:
int (*p)(int ,int)=max;
声明函数指针需要注意的事项:
1.指针对应的数据类型必须与函数返回类型相同。
2.指针的参数列表必须与函数参数列表中的数据类型的顺序一致,不需要形参。
我们来看一个例子,更好的理解函数指针的使用。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int max(int x, int y)
{
return x > y ? x : y;
}
int main()
{
int a = 20;
int b = 10;
int rm, rp;
int (*p)(int, int) = &max;
rm = max(a, b);
printf("max(%d,%d)=%d\n", a, b, rm);
rp = p(a, b);
printf("p(%d,%d)=%d\n", a, b, rp);
return 0;
}
执行结果:
3.加深对函数指针的认识
我们先看两段代码:
//代码1
(*void(*<