指针函数和函数指针

指针函数和函数指针

(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);

​ 可以简单粗暴的理解为,指针函数的是属于数据类型的,而函数指针的星号是属于函数名的。【再简单一点,可以这样辨别两者:函数名带括号的就是函数指针,否则就是指针函数。】

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值