失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 高质量程序设计指南c++/c语言(33)--函数指针

高质量程序设计指南c++/c语言(33)--函数指针

时间:2023-07-09 11:37:20

相关推荐

高质量程序设计指南c++/c语言(33)--函数指针

函数类型由其返回类型和形参表确定,而与函数名无关。

// pf points to function returning bool that takes two const string referencesbool (*pf)(const string &, const string &);

*pf两侧的括号是必须的

// declares a function named pf that returns a bool *bool *pf(const string &, const string &);

1、指向函数的指针的初始化和赋值

在引用函数名但是又没有调用该函数时,函数名将被自动解释为指向函数的指针。

bool lengthCompare(const string &, const string &);

除了用作函数调用的左操作数以外,对lengthCompare的任何使用都将被解释为如下类型的指针

bool (*)(const string &, const string &);

typedef bool (* cmpFun)(const string &, const string &);cmpFun pf1 = 0;cmpFun pf2 = lengthCompare;pf1 = lengthCompare;pf2 = pf1;

函数指针只能通过同类型的函数或者函数指针或者0进行初始化和赋值。

cmpFun pf1 = lengthCompare;

cmpFun pf2 = &lengthCompare;

直接引用函数名等效于在函数名上应用取地址操作符。

2、通过指针调用函数

cmpFun pf = lengthCompare;lengthCompare("hi", "ss"); //direct callpf("ds", "sd"); //pf implicitly dereferenced(*pf)("sss", "sdd"); //pf explicitly dereferenced

3、函数指针形参

可以使用下面的两种形式

3.1、将形参定义为函数类型

void useBigger(const string &, const string &, bool (const string &, const string &));void useBigger(const string &, const string &, bool f(const string &, const string &));

注意第三个形参。

3.2、将形参定义为函数指针

void useBigger(const string &, const string &, bool (*)(const string &, const string &));void useBigger(const string &, const string &, bool (*f)(const string &, const string &));

4、返回指向函数的指针

// ff is a function taking an int and return a function pointer// the function pointed to returns an int and takes an int * and int int (* ff(int))(int *, int);

阅读函数指针声明的最佳方法就是从声明的名字开始从内向外理解。

要理解声明的定义,首先观察

ff(int)

将ff声明为一个函数,它带有一个int型的形参,该函数返回

int (*)(int *, int);

它是指向函数的指针。

使用typedef可使该定义简明易懂:

typeded int (*PF)(int *, int);

PF ff(int);

允许将形参定义为函数类型,但是函数的返回类型则必须是指向函数的指针,而不能是函数。

typedef int func(int *, int);//可以理解为把函数类型 int (int*, int)重命名为funcvoid f1(func); //等价于void f1(int f(int*,int)), ok: f1 has a parameter of function typefunc f2(int); // error: f2 has a return type of function typefunc * f3(int); //ok: f3 returns a pointer to function type

5、指向重载函数的指针

extern void ff(double);extern void ff(unsigned int);void (*pf1)(unsigned int) = &ff; //void (*pf1)(unsigned int) = ff;

指针的类型必须与重载函数的一个版本精确匹配。如果没有精确匹配的函数,则对该指针的初始化或赋值都将导致编译错误:

// error: no match:invalid parameter listvoid (*pf2)(int) = &ff;// error: no match:invalid return typedouble (*pf3)(double);pf3 = &ff;

如果觉得《高质量程序设计指南c++/c语言(33)--函数指针》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。