函数指针详解.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
这篇文章把函数指针的各种常用情况做了一个详解的总结。1.?指向普通函数的指针很简单,如下的例子可以说明基本格式和用法:int int_add(int a, int b) { return (a+b); } int int_sub(int a, int b) { return (a-b); } int (*int_operator)(int, int) = int_add; int _tmain(int argc, _TCHAR* argv[]) { coutint_operator(4, 5)endl; // output 9 int_operator = int_sub; coutint_operator(4, 5)endl; // output -1 return 0; } 上例中,int_operator会被编译器解释成类型int(*)(int, int)的一个指针。 调用方式还可以写作:(*int_operator)(4, 5),这样的好处是让人一眼就能看到int_operator是一个函数指针。 注意:函数指针和指向函数的返回值的类型和参数都必须严格一致;2.?函数指针数组我们还可以声明一个函数指针的数组,比如: int (*pFuncArray[10])(); []的优先级高于*,该语句将pFuncArray声明为拥有10个元素的数组,每一个元素都是指向一个函数的函数指针,该函数没有参数,返回值类型为int;注意不能写作:int ((*pFuncArray)[10])(),这样会产生编译错误; (*pFuncArray)[10]表明了pFuncArray是一个指针,该指针指向一个’含有?10个元素的数组’; 其类型为int()(),显然,编译不能通过。将上面的声明转换为typedef格式,会使程序可读性增加: typedef int(*pFunc)(); pFunc pFuncArray[10]; 如果需要调用其中的第三个函数,那么调用方式为:pFuncArray[2]();3.?指向‘函数指针数组’的指针 还可以声明一个指向‘函数指针数组’的指针,比如下面的例子代码:int cmp_len(const char *str1, const char *str2) { return ((int)strlen(str1) - (int)strlen(str2)); } int cmp_str(const char *str1, const char *str2) { return strcmp(str1, str2); } typedef int(*PCMP_FUNC)(const char*, const char*); PCMP_FUNC pCmpFuncs[2] = { cmp_len, cmp_str, }; // 声明指向pCmpFuncs的指针 PCMP_FUNC (*ppCmps)[2] = pCmpFuncs;? 声明分解说明如下: (*ppCmps):表明ppCmps是一个指针; (*ppCmps)[2]:后面紧跟[2],表明ppCmps是一个指向‘两个元素数组’的指针 PCMP_FUNC表明了该数组元素的类型,它是指向函数的指针,返回值为int,有两个const char*类型的参数; 实际上语句PCMP_FUNC?(*ppCmps)[2] = pCmpFuncs; 将会被编译器解释为: int?(*(*ppCmps)[2])(const?char*,?const?char*) = pCmpFuncs; 声明分解: (*ppCmps):表明ppCmps是一个指针; (*ppCmps)[2]:后面紧跟[2],表明ppCmps是一个指向‘两个元素数组’的指针 int (*)(const char*, const char *):表明了该数组元素的类型,它是指向函数的指针,返回值为int,有两个const char*类型的参数; ? 3.?函数指针与类在C++语言中,使用函数指针可以指向类的一个成员函数或变量,虽然这种用法很少能用到,至少我是没有用过,不过了解一下还是有点必要的。 为了支持这类指针,C++有三个特殊的运算法符:::*,.-,.*; 指向成员函数的指针必须与向其赋值的函数类型匹配,这包括:1)参数的类型和个数;2)返回值类型;3)它所属的类型; 指向成员变量的指针必须与向其赋值的变量类型匹配,这包括:1)变量类型;2)它所属的类型; 成员函数和变量必须被绑定到一个对象或者指针上,然后才能得到调用对象的this指针,然后才能指向成员变量或函数; 类AClass的成员变量int m_iValue,其完整类型是:int型的类AClass的成员m_i

文档评论(0)

word.ppt文档 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档