病例:不理解C/C++的函数指针

转载 2006年06月08日 20:16:00

病人:医生,我折腾了许久,无法理解函数指针。
中医:能意识到自己不理解,不错。那么你说说你目前的理解。函数指针是什么?
病人:函数指针是指向函数的指针。

中医:那么函数是什么?
病人:函数就是函数。
中医:不是指向函数的指针?
病人:自然不是。

中医:那函数怎么可以赋值给函数指针?难道int可以赋值给int* ?
病人:这个。。。。。。

中医:逻辑不通了吧?
病人:是啊,怎么回事哩?

中医:这个问题先搁置一下,我问你,什么是指针?
病人:是放地址的变量。
中医:函数指针里面放的什么?
病人:函数入口地址。
中医:那么函数指针就是放函数入口地址的变量?
病人:  (小心地)我同意。
中医:函数是放函数入口地址的常量。
病人:哇!这样一来就好解释了!函数赋值给函数指针就像把常量赋值给同类型变量!

中医:还有问题吗?
病人:有,"函数是放函数入口地址的常量。"这句话不通啊。
 函数是放自己入口地址的东西?
中医:孺字可教。这里"函数入口地址"是一个词,不能拆。真正的函数,无非是一块代码,
 C/C++中没有描述"一块代码"的东西,
 只有描述"一块代码"的入口地址的东西,函数及函数指针。
病人:我懂了,"函数指针是指向函数(1)的指针"和"函数(2)不是指向函数(3)的指针"的矛盾,
 出自"函数(1)"的是你刚才说的"真正的函数",
 函数(2)(3)指的C/C++语法意义上的"函数",两码事!
 
中医:嗯,有道理。那么还有问题吗?    
病人:"函数指针是指向函数的指针。"这句话固然误导人,不过C/C++的语法,也起到了推波助澜的作用。

//////////////////////////////////
#include
typedef int (*FN_HAHA)();
int real_haha()
{
 return printf("haha/n");
}

void main(int argc, char* argv[])
{
 FN_HAHA haha=real_haha;
 real_haha();
 (*haha)(); 
}
//////////////////////////////////

既然  haha 和 real_haha是一个层次上的东西,
那么调用的时候为什么 一个 "real_haha();",
一个(*haha)()哩?很明显是在搞分化,搞脑子。

医生:连C/C++语法你都敢批评,强的!
    正如你所说,这不是好的语法,所以现在的编译器,比如VC和gcc,
    都允许用 haha();来代替传统的(*haha)();你44就知道了。
      至于书上都写(*haha)();我只能说,
       这个问题我自己也被书害了很久,最后扔了书自己想通的。
病人:我的病好了,我回去也把书扔了。

病例:不理解C/C++的函数指针

  一直对函数指针的概念一知半解的,于是搜索了一把,发现几个帖子讲解不错,就帖子这里了.                                       病例:不理解C/C++的函数指针作...
  • kesalin
  • kesalin
  • 2006年09月29日 10:07
  • 1995

病例:不理解C/C++的函数指针

病例:不理解C/C++的函数指针 病人:医生,我折腾了许久,无法理解函数指针。中医:能意识到自己不理解,不错。那么你说说你目前的理解。函数指针是什么?病人:函数指针是指向函数的指针。中医:那么函数是什...
  • discory
  • discory
  • 2006年12月30日 18:40
  • 781

不理解C/C++的函数指针

病例:不理解C/C++的函数指针 病人:医生,我折腾了许久,无法理解函数指针。中医:能意识到自己不理解,不错。那么你说说你目前的理解。函数指针是什么?病人:函数指针是指向函数的指针。中医:那么函数是什...
  • RoyMuste81
  • RoyMuste81
  • 2005年12月22日 10:10
  • 566

不理解C/C++的函数指针

病人:医生,我折腾了许久,无法理解函数指针。中医:能意识到自己不理解,不错。那么你说说你目前的理解。函数指针是什么?病人:函数指针是指向函数的指针。中医:那么函数是什么?病人:函数就是函数。中医:不是...
  • huangmindong
  • huangmindong
  • 2014年04月29日 13:27
  • 266

在C和C++下声明函数指针的方式

在C的规范下,声明一个函数指针的方式如下: //comm.h #ifndef COMM_H #define COMM_H void test_print(const char*); void(*co...
  • u013600225
  • u013600225
  • 2017年04月05日 15:16
  • 539

C/C++回调方式系列之一 函数指针和函数回调模式

一、函数指针 1. 函数的定义 return_type function_name(parameter list) { function_body }...
  • SweetTool
  • SweetTool
  • 2017年05月20日 15:45
  • 1482

C/C++之回调函数---函数指针的作用

今天讨论下C/C++中的回调函数。      在理解“回调函数”之前,首先讨论下函数指针的概念。 函数指针 (1)概念:指针是一个变量,是用来指向内存地址的。一个程序运行时,所有和运行相关的物件都是需...
  • kkk0526
  • kkk0526
  • 2013年12月04日 17:24
  • 5463

c/c++ 函数类型和函数指针类型 详解

c/c++ 中数据结构跟指针真的是很强大 今天解释下 函数类型和函数指针类型 1.函数类型 在C语言中,函数也是一种类型,可以定义指向函数的指针。我们知道,指针变量的内存单元存放一个地址值, 而函...
  • feigegegegegegegeg
  • feigegegegegegegeg
  • 2016年09月08日 11:41
  • 3674

C/C++函数指针用法总结

C++函数指针 一函数指针介绍   函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关。举例如下: int add(int nLeft,int nRight);//...
  • u013507368
  • u013507368
  • 2014年12月02日 16:48
  • 706

[C/C++]如何解读返回函数指针的函数声明

int (*(*pf())())() { return nullptr; }   从来没有见过这样的函数声明。那么它究竟是一个怎样的函数呢?我努力回忆起《C专家编程》一书的内...
  • u012861978
  • u012861978
  • 2015年09月12日 09:43
  • 1093
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:病例:不理解C/C++的函数指针
举报原因:
原因补充:

(最多只允许输入30个字)