• 【C/C++学习】之七、指向函数的指针


    什么是指向函数的指针

    函数指针是指向函数的指针变量,不是指向对象的指针!函数指针本身应该是“指针变量”;

    “在C语言中,函数本身不是变量,但可以定义指向函数的指针,这种指针可以被赋值、存放于数组之中,传递给函数及作为函数的返回值等” --《The C Programming Language Second Edition》

    一个函数在编译的时候被分配一个入口地址,这个入口地址就称为函数指针。就一个函数来说,他做两件事,1、调用它。2、取得他的地址。 当你通过取得函数的地址来得到指针,那你就可以用这个指针来调用函数了!

    下面来看一个实例:

     bool (*pf)(const string &, const string &) 

    这里pf声明是一个指向函数的指针。参数是两个const string &类型和bool类型的返回值!

    OK继续看:

     void a(int);
     void (*b)(int);
     b = a;
     //b = &a; //等效的   效果一样

    当然要知道的是,指向函数的指针的声明你必须也要给出参数,跟函数声明是一样的,通过上面的实例会看出来的。 你调用函数的时候,参数也要完全匹配。 下面的应用中会给出实例;


    下面我们来看一下用typedef来简化:

    我们来简化一下函数指针;

    typedef int (*ta)(int a);
    在这里,ta 是一种指向函数的指针类型的名字。   你要使用这个函数指针的时候,你只需要直接使用tf 就可以了。

    如:  tf af = 0;

             tf bf = a;

    就像这样。


    当然,指向函数的指针也可以用来作为参数:函数的参数可以是变量、指向变量的指针变量、数组名、指向数组的指针变量,也可以是指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。

      void  sub ( int ( *x1) (int), int (*x2) (int,int) )
        {
          int a,b,i,j;
          a = (*x1)(i);      /* 调用 f1 函数 */
          b = (*x2)(i)(j);    /* 调用 f2 函数 */
        }

    我们也可以通过指针来调用函数,在下面的如何使用函数指针那里我们会看到实例。


    下面再来看一下  返回函数的指针。

    int (*ff(int))(int *, int);

    这个有点难理解了,我们要从里往外看:

    ff(int)   这里将ff声明为一个函数,它有一个int的形参。  

    这个函数的返回值就是int (*)(int *, int);

    这是一个指向函数的指针。我们来变一下形式:

    typedef int (*func)(int*, int); 
    func ff(int)


    最后看一下重载函数的指针:

    void ff(string);
    void ff(int);
    
    void (*pf1)(int) = &ff;

    指针的类型必须与重载函数的一个版本精确匹配。如果没有匹配那么对这个指针的初始化或者赋值豆浆导致编译错误;


    最后要注意的是,指向函数的指针没有++   --运算符;

    指向函数的指针如何使用

    #include<iostream>
    using namespace std;
    
    int max(int a, int b)//来定义一个函数
    {
    	if (a > b)
    	{
    		return a;
    	}
    	else
    	{
    		return b;
    	}
    }
    
    int main()
    {
    	typedef int (*tf)(int a, int b); //tf是别名
    	int (*f)(int a, int b);//f是函数指针
    	int a, b, c;
    	f = &max;//赋值   &这个符号有没有都可以
    
    	tf af = max;//初始化  赋值
    
    	cin >> a >> b;
    	c = (*f)(a, b);//调用
    	cout << c << endl;
    
    	c = af(a, b);//调用
    	cout << c << endl;
    	return 0;
    
    }


    指针函数和函数指针

    指针函数是指返回值是指针的函数,即本质是一个函数。而函数指针在上文我们已经介绍了那么多了!

    实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。


    2012/8/20

    jofranks于南昌


  • 相关阅读:
    .net4.5使用async和await异步编程实例
    并行开发系列 Plinq等
    改善C#程序的建议9:使用Task代替ThreadPool和Thread
    C# Task 用法
    Task
    C#委托的介绍(delegate、Action、Func、predicate)(转)
    ACTION与FUNC
    C#二叉树简易实例
    一些简单的算法
    教你如何写thinkphp多表查询语句
  • 原文地址:https://www.cnblogs.com/java20130723/p/3211409.html
Copyright © 2020-2023  润新知