函数指针和指针函数

本文介绍了函数指针和指针函数的概念,通过示例展示了它们的区别和使用方法,包括指针数组和数组指针的应用。同时,讨论了在C/C++中如何声明和使用函数指针,以及.*和->*运算符在不同情况下的应用。

何为函数指针和指针函数

上例子:

int *Sum(int a,int b)
{
	return &(a+b)
}
int (*p)(int,int);
p = Sum;

此时,称Sum是返回值是指针型的函数,即指针函数,p是指向函数的指针,也就是我们说的函数指针;
函数指针的声明方法是:
返回值类型 ( * 指针变量名) ([形参列表]);
在C++中也可以

typedef int (*PFUNC)(int,int)

此时,PFUNC等价于一个有两个int型参数的函数指针类型,可以通过:

PFUNC pcfun = sum;

声明名为pcfun的函数指针,更加方便。
对于cdcel类型的函数进行typedef声明是可行的,对于this call的函数指针声明则是:

typedef void(Text::*PFUNC)(int,int);

在thiscall中(*pcfun)(10,20)是不行的,需要在指针函数前加上对象调用
例如(text1.*pcfun)(int,int);这就是.*的运算符

函数指针进行赋值时加上相对应的名字作用域方可,此时的赋值代码为:

PFUNC pcfun = &Text::Sum;

.*运算符和->之前有提到,我们稍微复习一下:
出现.*运算符的情况:_thiscall调用约定的函数指针来调用普通成员方法的时候
->*运算符出现的情况:用指向对象的指针来调用_thiscall调用约定的函数指针调用普通成员方法的时候。

他们的区别

指针函数我们经常用到,他的作用显而易见,返回一个指针型的数据,适用范围很广。
其定义格式如下所示:
返回类型标识符*函数名称(形式参数表)
{函数体}

而函数指针和C语言中的泛式很像,可以接受符合函数指针声明时的函数地址,此时,函数指针指向的函数地址将和声明的函数地址相同,两者等价。
另提一点:在C/C++中,函数入口就是函数名,所以在传函数入口时可以写函数名也可以对函数名取地址,都是可行的。
函数指针可以指向任何一个符合类型的函数,使用起来比较自由,

指针数组和数组指针

int *Sum[10];//这里的Sum是保存了10个int*类型的数组,里面的元素都是int*类型,适用于保存一系列指针时使用,向后拓展可以放入容器,让容器存储若干个指针型数据,称为指针数组
int (*a)[];//a是指向数组的指针,和int a[]基本没差别,都是指向数组,我们知道,数组名就是数组的首元素地址,在使用层面上,两者等价。这个称为数组指针

指针函数和函数指针

对于函数来说,需要考虑返回值类型,而数组则不需要。所在数组和函数中,*号的使用方式有所不同,
在数组中为指针数组,在函数中,则是返回值为类型的地址。
在数组中为数组指针,在函数中,则是指向函数的指针。
这时我们可以封装一个普通函数封装函数指针,传参是函数指针,这个我们下面会提到。

数组指针和函数指针的例子

int *(*F)(int,int)(int);
函数指针F指向的函数有两个形参并且返回一个函数指针,返回的指针指向一个有一个int形参且返回int的函数
这个例子便是使用普通函数封装函数指针,这个函数指针返回一个有一个int形参且返回int的函数。
int*(*abc())();返回的是函数指针
函数指针是指向函数的指针 int (*a)();可以用a来代替声明类型相同的函数
int *(*a)(int,int);也是函数指针
int (*arr[10])(int,int);一个数组,每个元素保存一个函数指针
数组指针是指向数组的指针 int (*a)[];和int a[]基本没差别
指针数组是保存指针的数组 int* a[];存储的是指针
int f()[]//f是一个函数,他的返回值是一个整形数组,这个是不可以的,返回值只能有一个,不能是一个集合。
对于这个例子,我们无法返回一个数组,但是如果返回的是指针,拓展性就很强了,返回一个指向结构体的指针,结构体内部由我们自己定制,这样扩展性和实用性就会大大提高。
int (*f[])();返回值是int
int *(*f[])();返回值是int *
int (**(*abc)())();返回函数指针的指针
int (*(*abc)())[6];返回值是是一个数组的指针
int *(*(*(*abc)())[6])();过于复杂
对于函数来说,需要考虑返回值类型,而数组则不需要。所在数组和函数中,*号的使用方式有所不同,
在数组中为指针数组,在函数中,则是返回值为类型的地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值