函数指针和指针函数有什么区别

问题

函数指针和指针函数有什么区别?

指针函数

指针函数:本质上是一个函数,其返回值是一个指针

声明形式:(以下几种都可以)

int *fun(int x,int y);
int * fun(int x,int y);
int* fun(int x,int y);		//这种写法相对容易理解一些,函数的返回值是一个 int* 指针

指针函数代码示例:

#include<iostream>
using namespace std;
struct Data {
	int a;
	int b;
};
//指针函数
Data* fun(int a, int b) {
	Data* data = new Data;
	data->a = a;
	data->b = b;
	return data;	//返回的是一个指针
}
int main(){
	Data* myData = fun(4, 5);	//调用指针函数
	cout << "a = " << myData->a << endl;
	cout << "b = " << myData->b << endl;
	return 0;
}

函数指针

函数指针:本质上是一个指针,一个指向函数的指针变量

声明格式:类型说明符 (*函数名) (形参)

int (*fun)(int x,int y);	//声明一个函数指针,即一个指向函数的指针

函数赋值:(即函数指针需要把一个函数的地址赋值给它)

fun = &Function;	//假设Function是一个函数名,&取函数的地址
fun = Function;		//&不是必需的,因为函数名本身就表示了它的地址,类似数组名一样

函数指针的调用:(以下两种都可以,但都必须包含一个圆括号括起来的参数列表)

a = (*fun)();	//这种写法更加直观一点,可以直接看出是通过只针的方式调用函数的
a = 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 main(){
	int (*fun)(int x, int y);	//声明一个函数指针
    
	fun = &add;		//函数赋值第一种方式
	cout << "(*fun)(1,2) = " << (*fun)(1, 2) << endl;	//通过函数指针调用函数
    
	fun = sub;		//函数赋值第二种方式
	cout << "(*fun)(5,3) = " << (*fun)(5, 3) << endl;
	return 0;
}

总结

总结一下函数指针和指针函数的区别:

定义不同

指针函数:本质上是一个函数,其返回值是一个指针

函数指针:本质上是一个指针,一个指向函数的指针

写法不同

指针函数: int* fun(int x,int y);

函数指针: int (*fun)(int x,int y);

区分方法:函数名带括号的就是函数指针,不带括号的就是指针函数。

补充:还可以通过从右到左结合的方式区分,如
①对于指针函数 int* fun(int x,int y),形参列表先和函数名fun结合,也就是说fun首先是一个函数,剩下的为函数的返回类型int*。
②对于函数指针 int (*fun)(int x,int y),因为括号优先级高,所以*号会先和函数名fun结合,也就是说fun此时先是一个指针,再与形参列表结合,成为一个指向函数的指针,剩下的int为函数的返回类型。
用法不同

具体请看上面代码示例。

参考资料

函数指针和指针函数用法和区别

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐先生的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值