• c :函数指针具体解释


        在研究opencv源码的过程中。处处可见到函数指针,于是翻出来谭浩强的《C程序设计》把函数指针这一块内容再补一补!

    1 定义

    数据类型 (*指针变量名)(參数表);

    注:

    数据类型是指的函数返回值的类型;

    (*指针变量名)两側的括号不能省略。表示p先与*结合,是指针变量。然后再与后面的(參数表)结合;

    (參数表)能够是一个參数,也能够是多个參数,只是在引用的时候要保证形參与实參一致。

    2 int (*p)(int a, int b);

         表示定义一个指向函数的指针变量p,它不是固定的指向哪一个函数。而是表示定义了这样一个类型的变量。它是专门用于存放函数的入口地址的。我们都知道每个函数都占用一段内存单元,它们有一个起始地址,我们就是使用函数指针来指向函数的入口地址的。

    在一个程序中,同一个函数指针变量能够指向多个函数,可是要务必保证这些函数都是同类型的不同函数。

    3  赋值

    在给函数指针变量赋值时,仅仅须要给出函数名,而不必给出參数,比方:

    p=max。

    而不能写成:

    p=max(x。y);

    由于是将函数入口地址赋给p,而不涉及到实參和形參的结合问题。

    4 注意

    和数组名代表地址数组地址首地址类似。函数名代表该函数的入口地址。

    p是指向函数的指针变量,它仅仅能指向函数的入口处。而不能指向函数的中间的某条指令,因此不能用*(p+1)来表示函数的下一条指令。

    同理,p++,p--或者p+n都是不正确的。

    5 实例

     
    #include <stdio.h>
    int max(int x, int y);  /*函数声明   求最大值*/</span>
    int min(int x, int y);  /*函数声明   求最小值*/</span>  
    int add(int x, int y);  /*函数声明     求和值*/</span>  
    void process(int i, int j, int (*p)(int a, int b)); /*函数声明 调用函数指针*/
      
    int main()  
    {  
        int x, y;  
        cin>>x>>y;  
      
        cout<<"Max is: ";  
        process(x, y, max);  
      
        cout<<"Min is: ";  
        process(x, y, min);  
      
        cout<<"Add is: ";  
        process(x, y, add);  
      
        getch();  
        return 0;  
    }  
      
    int max(int x, int y)       /*函数定义   求最大值*/
    {
    return x > y ? x : y;
     } 
    int min(int x, int y)       /*函数定义   求最小值*/
    {
     return x > y ?

    y : x; } int add(int x, int y) /*函数定义 求和值*/ { return x + y;  } void process(int i, int j, int (*p)(int a, int b)) <pre name="code" class="cpp"> /*函数定义 调用指针*/

    {
     cout<<p(i, j)<<endl;
     }
    
    

    
    

    当输入为:

       1    2

    输出结果为:

    max is:2

    min is:1

    add is:3

    6 补充

    以下对上述样例再做一下补充,从本例中能够看出不论调用max,min,还是add,函数process一点都没有修改,仅仅是在调用process函数时改变了实參函数名而已。这就添加了函数使用的灵活性。能够编写一个通用的函数来实现各种专用的功能。须要注意的是,对作为实參的函数,应在主调函数前(中)先函数声明。

    參考内容:

    《c程序设计》(第三版)谭浩强


  • 相关阅读:
    TCP/IP三次握手四次挥手
    注解(JDK1.5之后)
    枚举(JDK1.5之后)
    局部内部类
    非静态内部类
    静态内部类
    匿名内部类
    接口
    根父类:java.lang.Object
    native关键字
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6748811.html
Copyright © 2020-2023  润新知