这篇是为了加深记忆所写。发现,很多知识若不经过反复的琢磨和动手实践,是很难记得住的。

1)  函数指针的初始化。

函数如下:

1 int CompareString(const string& str1, const string& str2)
2 {
3     return str1.compare(str2);  

4 }

函数的初始化有两种方式:

第一种,也是最普遍的方式:

1 int (*CompareFunction)(const string&, const string&) = CompareString;

第二种,是使用typedef定义函数类型,这种写法有助于对代码的理解:

1 typedef int (*CompareFunctionType)(const string&, const string&);
2 CompareFunctionType CompareFunction = CompareString;

2)  函数指针赋值。

函数名可以理解为该类型函数的指针。当然,取地址操作符作用于函数名上也能产生指向该类型函数的指针。也就是说下面两种赋值都是可行的:

1 CompareFunctionType CompareFunction = CompareString;
2 CompareFunctionType CompareFunction = &CompareString;

3)  函数调用。

无论是用函数名调用,还是用函数指针调用,还是用显式的指针符号调用,其写法是一样的:

1 CompareString("abc", "cba");
2 CompareFunction("abc", "cba");
3 (*CompareFunction)("abc", "cba");

4)  函数指针的数组。

对于函数指针的数组,强烈建议使用typedef方式定义类型之后再使用,不然影响代码的阅读性,继续以以上例子为例:

1 //without typedef
2 int (*CompareFunctionArray[3])(const string&, const string&);
3 //with typedef
4 CompareFunctionType CompareFunctionTypeArray[3];

5)  函数指针用做函数返回值的类型。

到这一步,会发现typedef是多么的好用了。不然我是完全读不懂下面语句的意思的:

1 //without typedef
2 int (*func(int*, int))(const string&, const string&);

上面的声明,将func(int*, int)声明为一个函数,返回值为函数指针,函数类型为int (*)(const string&, const string&)。

多么的晦涩啊!

如果写成typedef就不用这么纠结了,足见typedef的作用:

1 CompareFunctionType func(int*, int);

6)  指向extern "C"函数的指针。

《C++ primer 3》中有指出,指向C函数的指针和指向C++函数的指针类型不同,但是现在的很多编译器都有语言扩展,认为这两种函数的指针具有相同的特性。

所以,我在vs 2010中做了尝试,结果证明是支持这种语言扩展的。

函数声明如下:

1 extern "C" int InsideFunctionC(const string& str1, const string& str2)
2 {
3     return str1.compare(str2);
4 }

6 int InsideFunctionCPlusPlus(const string& str1, const string& str2)
7 {
8     return str1.compare(str2); 

9 }

函数指针的初始化和调用,允许赋值为指向C函数的指针:

1 int (*CompareFunction)(const string&, const string&) = InsideFunctionC;

另外还有一点,当extern "C"应用在一个声明上时,所有被它声明的函数都将受到影响。举个例子:

1 extern "C" void OutSideFunction(int (*fc)(const string&, const string&))
2 {
3     cout<<fc("abc", "cba")<<endl;;
4 }

这里的OutSideFunction和fc都将受到extern "C"的影响,但是vs2010编译器是支持一个指向C++函数的指针作为OutSideFunction的参数。如下:

1 int main()
2 {
3     OutSideFunction(InsideFunctionC);
4     OutSideFunction(InsideFunctionCPlusPlus);
5     
6     return 0; 

7 }

到此就差不多了。昨天看了一遍,今天又写博客温习了一遍,应该算是加深记忆了。傻笑一个。

转载于:https://www.cnblogs.com/AnnieKim/archive/2011/11/20/2255813.html

恼人的函数指针(一)相关推荐

  1. 恼人的函数指针(二)

    原文链接:http://www.cnblogs.com/AnnieKim/archive/2011/12/04/2275589.html 前面曾写过一篇恼人的函数指针(一).总结了普通函数指针的声明. ...

  2. 【转载】恼人的函数指针(一)

    本文转载自: http://www.cnblogs.com/AnnieKim/archive/2011/11/20/2255813.html#undefined> 这篇是为了加深记忆所写.发现, ...

  3. 分清函数指针和指针函数

    分清函数指针和指针函数 1.指向函数的指针(函数指针) 来分析这样一个声明,void (*f) ( );虽然()的优先级高于*,但由于有括号存在,首先执行的是解引用,所以f是一个指针:接下来执行( ) ...

  4. c/c++中的函数指针和指针函数

    定义 1.指针函数,本质是函数,返回值为指针,形如,int *pfun(int, int),由于"*"的优先级低于"()"的优先级,所以等同于int *(pfu ...

  5. 函数指针amp;绑定: boost::functoin/std::function/bind

    see link: https://isocpp.org/wiki/faq/pointers-to-members function vs template: http://stackoverflow ...

  6. 0709 C语言常见误区----------函数指针问题

    1.函数指针的定义 对于函数 void test(int a, int b){ // } 其函数指针类型是void (* ) (int , int), 注意这里第一个括号不能少, 定义一个函数指针,v ...

  7. java跨函数跳转_C语言中将绝对地址转换为函数指针以及跳转到内存指定位置处执行的技巧...

    1.方法一 要对绝对地址0x100000赋值,我们可以用 (unsigned int  * ) 0x100000 = 1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做? ...

  8. 函数指针(就做个笔记)

    1,函数的地址 #include <stdio.h> int main(){int i=0;printf("main=%p\n",main);printf(" ...

  9. 函数指针--Nginx和Redis中两种回调函数写法

    1.Nginx和Redis中两种回调函数写法 #include <stdio.h>//仿Nginx风格 //结构外声明函数指针类型 typedef void (*ngx_connectio ...

最新文章

  1. 剑指offer: 替换空格 python实现
  2. IT风险管理专家CISRE认证
  3. OpenCV2.4.9 显示鼠标框选区域,其他部分全为零,鼠标创建ROI区域
  4. BATCH+VBS脚本自动执行命令
  5. LDA-math-神奇的Gamma函数
  6. 手机微信网站开发放弃windows phone的理由
  7. unity3d 使用GL 方式画线
  8. PostgreSQL 配置内存参数
  9. 输入输出阻抗,是怎么玩的?你会不?音频耦合电容怎么大小不一?
  10. C++检测平面内两个三角形是否相交(逻辑清晰,手撕精简版)
  11. QQ号大规模被盗与你我有什么关系?你我该如何做?
  12. 浅谈链表的构建,next到底是什么
  13. CSDN去广告JS插件
  14. 看教程学虚幻四——粒子特效之魔法阵
  15. 获取ccid的标准方法
  16. LTE上行物理层传输机制(1)-PUSCH上行跳频之Type1频率跳频
  17. react-native APP图标和名字的配置
  18. anmate.css怎么用,animate.css使用方法是什么
  19. Java+Selenium+Junit demo
  20. 【C++】Lambda 表达式详解

热门文章

  1. 离线实时与api对应的关系+未来流行度
  2. LookupError: No installed app with label 'user'
  3. 关于python的线程安全的一些理解.
  4. reshape中的-1的含义
  5. 《On the Momentum Term in Gradient Descent Learning Algorithm》原文解读
  6. 大话数据结构 队列10:数组循环队列
  7. 天池大赛, Storm
  8. 字段定义_逐浪CMS对用户注册字段正则的自由定义(注册字段必填)
  9. c语言指针中冒号的用法,在c中使用冒号后面的类名
  10. springmvc 后台向页面EasyUI的Datagrid传递数据(JSon格式)