• 函数指针的两种调用形式(转)


    void test(int);
    int main(void){
    void (*fp)(int);
      fp=test;
      (*fp)(9);      

      fp(9);
      return 0;
    }
    void test(int a)
    {
      printf( "%d ", a );
    }


    这两种形式是等价的,都是为ANSI C所接受的。
    历史上,贝尔实验室的C和UNIX的开发者采用的是第一种观点
    QUOTE:
    (*fp)(9);
    而Berkeley的UNIX的扩展者采用第二种观点
    QUOTE:
    fp(9);


    K&R C不允许第二种形式。
    但是为了保持与现有代码的兼容性,ANSI C把这两者作为等价形式全部接受


    正如 kernelxu 所言,按照标准 C 的规定两种函数调用方式都是正确的。
    这是因为在 C/C++ 中总是使用函数指针的形式来调用函数。即使在函数调用中使用的是函数指示符(代表函数类型),也会被转换为函数指针使用,这就是默认的 function-to-pointer 转换。
    例如,楼主程序中的 test 函数可以直接使用函数指示符形式来调用:test( 9 );。然而,在这里的函数指示符 test 其实被编译器自动转换为了函数指针来使用,即从函数类型转换为了函数指针类型,最终是使用函数指针的形式来完成对函数调用的
    程序中的 fp( 9 ); 是直接使用函数指针 fp 来调用。既然 fp 已经是函数指针了,所以在类型上就不需要任何转换了。
    (*fp)( 9 ); 也是合法的函数调用。在这里,fp 是函数指针,所以 *fp 是对于函数的引用,是函数类型。根据标准规定的 function-to-pointer 转换又把 *fp 由函数类型转换为了函数指针类型,所以实际上 (*fp)( 9 ); 相当于 fp( 9 ); 这种直接的函数指针调用方式。
    另外,test 函数也可这样调用:(*test)( 9 );。可以这样来理解:根据   function-to-pointer 转换规定首先 test 由函数类型转换为函数指针,那么 *test 表示的又是函数类型,最后又根据   function-to-pointer 转换为函数指针来调用函数。这其实和 (*fp)( 9 ); 是等价的。
    甚至 test 函数还可以这样调用:(**test)( 9 );、(***test)( 9 );、(****test)( 9 ); 等等,或者函数指针形式:(**fp)( 9 );、(***fp)( 9 );、(****fp)( 9 ); 等等。对此的理解可参看上段中的分析。
    从上面的分析可以看出,函数调用的时候可以使用函数指针的方式,也可以使用函数指示符的方式。不过,后者会由编译器自动转换为前者的形式,即函数指针的形式。和指向对象的指针相比,这是函数指针一个比较特殊的地方。

  • 相关阅读:
    【2021 ECUG Con】聚势而来,与你相约花开时
    为 Nginx 添加 HTTP 基本认证(HTTP Basic Authentication)
    centos6 yum 源失效 404
    [nsis]安装包反编译
    Web安全测试学习笔记-DVWA-盲注(使用sqlmap)
    Shellcodeloader免杀过火绒
    C#创建快捷方式-转载自ConExpress
    C#运行新线程,也可打开网页
    C#判断指定文件是否存在-转载mmgx(仅为方便找一下)
    C# 文件夹创建方法
  • 原文地址:https://www.cnblogs.com/dayInAndOut/p/3636152.html
Copyright © 2020-2023  润新知