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])();过于复杂
对于函数来说,需要考虑返回值类型,而数组则不需要。所在数组和函数中,*号的使用方式有所不同,
在数组中为指针数组,在函数中,则是返回值为类型的地址
。
本文介绍了函数指针和指针函数的概念,通过示例展示了它们的区别和使用方法,包括指针数组和数组指针的应用。同时,讨论了在C/C++中如何声明和使用函数指针,以及.*和->*运算符在不同情况下的应用。
1642

被折叠的 条评论
为什么被折叠?



