本文转载自:
http://www.cnblogs.com/AnnieKim/archive/2011/11/20/2255813.html#undefined>

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

1) 函数指针的初始化。

函数如下:

 int CompareString(const string& str1, const string& str2){return str1.compare(str2);  }

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

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

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

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

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

2) 函数指针赋值。

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

CompareFunctionType CompareFunction = CompareString;
CompareFunctionType CompareFunction = &CompareString;

3) 函数调用。

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

CompareString("abc", "cba");
CompareFunction("abc", "cba");
(*CompareFunction)("abc", "cba");

4) 函数指针的数组。

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

 //without typedefint (*CompareFunctionArray[3])(const string&, const string&);//with typedefCompareFunctionType CompareFunctionTypeArray[3];

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

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

 //without typedefint (*func(int*, int))(const string&, const string&);

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

多么的晦涩啊!

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

CompareFunctionType func(int*, int);

6) 指向extern “C”函数的指针。

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

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

函数声明如下:
复制代码

extern "C" int InsideFunctionC(const string& str1, const string& str2){return str1.compare(str2);}int InsideFunctionCPlusPlus(const string& str1, const string& str2){return str1.compare(str2); }

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


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

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


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

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

int main()
{OutSideFunction(InsideFunctionC);OutSideFunction(InsideFunctionCPlusPlus);return 0; }

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

转载于:https://www.cnblogs.com/lanqiu5ge/p/9472221.html

【转载】恼人的函数指针(一)相关推荐

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

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

  2. 恼人的函数指针(一)

    这篇是为了加深记忆所写.发现,很多知识若不经过反复的琢磨和动手实践,是很难记得住的. 1)  函数指针的初始化. 函数如下: 1 int CompareString(const string& ...

  3. (转载)委托与函数指针辨析

    转载自 http://www.cnblogs.com/weidagang2046/archive/2009/08/09/1542248.html 感谢作者分享! 我们常见到C#技术文献用"类 ...

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

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

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

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

  6. 函数指针--全局函数指针与类的函数指针(二)

    本次对之前的说明做个补充,大体内容还是一样的. 这里对类里面的成员函数指针变量的使用继续进行了解,最主要的是希望能达到通过非静态成员指针变量来引用各自的非静态成员函数. 这样每个实例可以保存当前对象对 ...

  7. STC15分时内核中函数指针的使用问题

    2019独角兽企业重金招聘Python工程师标准>>> 基于前后台设计的系统随着功能的递增变得越来越难以维护, 所以决定为STC15F2K单片机编写一个基于时分的非抢占式内核,方便进 ...

  8. 函数指针与指针函数的区别

    原文:http://yliangliang.blog.sohu.com/86320000.html 一.函数指针 首先它是一个指针,只是这个指针指向的是一个函数.指针变量可以指向变量的地址.数组.字符 ...

  9. 函数重载(续)==》函数重载和函数指针在一起

    函数重载与函数指针(这一块很重要,后续要继续学习): 当使用重载函数名对函数指针赋值时 根据重载规则挑选与函数指针参数列表一致的候选者 严格匹配候选者的函数类型与函数指针的函数类型 #include ...

最新文章

  1. 微信小程序弹出用户授权弹窗,微信小程序引导用户授权,获取位置经纬度
  2. 深入理解DPDK程序设计|Linux网络2.0
  3. eclipse下web开发中缓存问题
  4. 破坏计算机系统既遂的标准,破坏计算机信息系统罪的量刑标准是什么
  5. Jquery 操作select总结
  6. 2万字带你攻略掉Selenium
  7. Log4j配置学习文档之一 log4j配置
  8. SpringCloud Config详解
  9. keybd_event()使用方法
  10. java 加载shellcode_MSF-Shellcode生成和使用
  11. C# 简单管理系统模板 控制台应用程序
  12. 累计分布函数与互补累计分布函数
  13. 康考迪亚计算机科学硕士,康考迪亚大学专业
  14. wakeup_sources
  15. Maven项目设置编码
  16. 计算机rom和硬盘,都是存储器,但RAM、ROM、闪存、硬盘怎么分?
  17. 钉钉开会使用虚拟摄像头
  18. 使用MATLAB计算一幅图像的熵
  19. 人工智能发展月报(2022年11月)
  20. 宇视网络视频录像机国标对接配置指导

热门文章

  1. linux系统网络编程简介,Linux网络编程入门
  2. 『ACM-算法-离散化』信息竞赛进阶指南--离散化
  3. Python+Opencv寻找图像中最亮的区域
  4. 玩转SVN系列之【如何放弃本地/服务器端所做的修改】
  5. linux-shell命令之cat【输出档案内容】
  6. T1串口波特率的计算方法
  7. Study to Innovation 的一般步骤总结
  8. PADS2007中的层类型(plane type) 简介
  9. 深度学习与计算机视觉(二)线性SVM与Softmax分类器
  10. 一、线性回归和逻辑回归