zoukankan      html  css  js  c++  java
  • C中函数指针的基本语法和思想

    1.C语言中函数的调用可分为直接调用和间接调用(函数指针),具体调用方法如下:

    int add(int a,int b)

    {

        return a+b;

    }

    void main()

    {

        add(1,2);//直接函数调用,函数名就是函数的入口地址

          

        //1.定义一个函数类型

        typedef int (myAdd1)(int ,int ); //myAdd1就是一个函数类型

        myAdd1 *p1=NULL;

        p1=&add; //这里写成p1=add也可以,这是因为C编译器是逐渐完善起来的,有兼容历史版本的原因在里面

        p1(3,4);//函数的间接调用

          

        //2.定义一个函数指针类型

        typedef int (*myAdd2)(int ,int ); //myAdd2就是一个函数指针类型

        myAdd2 p2=NULL;

        p2=&add; 

        p2(3,4);//函数的间接调用

        //3.直接定义一个函数指针变量

        int (*p3)(int ,int ); //myAdd2就是一个函数指针类型

        p3=&add; 

        p3(3,4);//函数的间接调用

    }

    2.C语言中,函数指针做函数参数的方法:

    //函数的具体实现

    int add1(int a,int b)

    {

        return a+b;

    }

    int add2(int a,int b)

    {

        return a+b;

    }

    int add3(int a,int b)

    {

        return a+b;

    }

    //函数的调用,实现求1+2的和的功能

    int fun(int (*padd)(int,int))

    {

        padd(1,2);

    }

    //主函数里面直接调用fun()函数,用一个统一的接口实现想要的功能

    void main()

    {

        fun(add1);

        fun(add2);

        fun(add3);

    }

    上面通过函数指针调用函数的方法,使用一种调用形式就可以实现不同函数的调用。这种做法思想上和C++中多态的思想是相同的,好处也非常明显:定义好函数的接口之后,后来人只要根据此接口去填写自己的代码,现在的人不需要改动什么就可以轻松地调用后来人写的代码。

    利用函数指针调用函数的精髓在于:函数指针类型提前做了约定。

    为了解释这句话的意思,可以对比上面的实例:fun()函数的传入参数,即函数指针padd提前封装好了函数对外的接口,包括函数输入、输出参数的类型、个数(函数add1(),add2(),add3()的类型是一样的)。这样fun()函数就可以利用一个统一的函数指针形参padd去描述函数的操作,相当于把框架搭建好了,函数的调用形式被确定下来了。具体执行的时候,再根据传来的实参去回调具体的函数代码,如add1()、add2()或add3()。因此,fun()函数的传入参数padd就如同是C++中的父类指针,add1(),add2(),add3()就像是C++中的纯虚函数的具体实现。

  • 相关阅读:
    codevs 1069关押罪犯
    codevs 1497取余运算
    codevs 3324 新斯诺克
    codevs 3286 火柴排队
    继续畅通工程
    还是畅通工程
    畅通工程(并查集找根节点)
    Eddy's picture(最小生成树)
    Constructing Roads(最小生成树)
    Codeforces Round #383 (Div. 2)C. Arpa's loud Owf and Mehrdad's evil plan
  • 原文地址:https://www.cnblogs.com/jswu-ustc/p/8409029.html
Copyright © 2011-2022 走看看