指针函数和函数指针
(1)、指针函数
简单的来说就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。
声明格式为: *类型标识符 函数名(参数列表)
//指针函数格式示例:
int *fun(int x,int y);
/*
它是一个 int * 类型的函数,其返回值是一个指针
*/
所谓的指针函数也没什么特别的,和普通函数对比不过就是其返回了一个指针 (即地址值)而已。
//指针函数的写法
int *fun(int x,int y);
int * fun(int x,int y);
int* fun(int x,inty);
//效果一样,写法看个人习惯,其实如果 * 靠近返回值类型的话,可能更容易理解其定义
(2)、函数指针
函数指针,其本质是一个指针变量,该指针指向这个函数,总结来说:函数指针 就是指向函数的指针。
声明格式:类型说明符(*函数名)(参数)
//函数指针格式示例
int (*fun)(int x,int y);
函数指针是需要把一个函数的地址赋值给它,有两种写法:
fun= &fun;
fun = fun;
/*
取地址运算符 & 不是必须的,以为一个函数标识符就表示了它的地址,如果是函数调用。还必须包含一个圆括号括起来的参数表。
*/
调用函数指针的方式也有两种:
x = (*fun)();
x = fun();
两种方式均可,其中第二种看上去和普通的函数调用没啥区别。如果可以的话,建议使用第一种,因为可以清楚地指明这是通过指针的方式来调用函数,当然,也要看个人习惯,如果理解其定义,随便怎么用都行。
//函数指针用法示例
#include<iostream>
using namespace std;
int add(int x, int y) //定义一个加法函数
{
return x + y;
}
int sub(int x, int y) //定义一个减法函数
{
return x - y;
}
int(*fun)(int x, int y); //定义一个函数指针
int main()
{
fun = add; //可以理解为指针指向变量(函数指针指向一个函数)
cout << "out1 (*fun)(1,2) = " << (*fun)(1, 2) << endl;
cout << "out2 (*fun)(5,2) = " << (*fun)(5, 3) << " " << fun(5, 3) << endl;
fun = sub; //可以理解为指针指向变量(函数指针指向一个函数)
cout << "out3 (*fun)(1,2) = " << (*fun)(1, 2) << endl;
cout << "out4 (*fun)(5,2) = " << (*fun)(5, 3) << " " << fun(5, 3) << endl;
/*
【函数指针可以理解为成一个指针,指向函数(每一个函数名都是函数的入口地址),上述的 (*fun)(5,3) 可以理解为指针的解引用。】
*/
return 0;
}
/*
结果:
out1 (*fun)(1,2) = 3
out2 (*fun)(5,2) = 8 8
out3 (*fun)(1,2) = -1
out4 (*fun)(5,2) = 2 2
*/
(3)、二者区别
a.定义不用
- 指针函数本质是一个函数,其返回值为指针;
- 函数指针本质是一个指针,其指向一个函数。
b.写法不同
- 指针函数: int *fun(int x, int y);
- 函数指针: int (*fun)(int x, int y);
可以简单粗暴的理解为,指针函数的是属于数据类型的,而函数指针的星号是属于函数名的。【再简单一点,可以这样辨别两者:函数名带括号的就是函数指针,否则就是指针函数。】