函数指针小记

  与一般的数据一样,函数在内存中也占有一定空间,所以函数也有“地址”的概念,函数指针就是指向这个“地址”(即函数代码块的起始地址),函数指针的type就是函数本身。知道了地址,我们很轻松的就能靠函数指针来完成函数调用。

1、简单函数指针:

1void add(int a, int b){  //这里写了一个很简单的函数
2     cout << a + b << endl;
3 }    
1 void (*p1)(int a, int b);  //声明一个函数指针,指向的函数类型为“返回void,两个int参数”的函数
2 p1 = add;            //赋值
3 //void (*p1)(int a, int b) = add;    //也可以这样赋值,一个意思
4 (*p1)(1, 2);          //这里是两种调用方法,出于某历史原因,这两者是等价的= =
5 p1(1, 2);

2、包含多个函数指针的数组:

1 void (*p2[2])(int a, int b);  //声明
2 p2[1] = add;            //赋值
3 p2[1](2,3);            //调用,同样两种方法都可以
4 (*p2[1])(3,4);

3、指向包含多个函数指针数组的指针:
稍微有一点点拗口,这个指针指向的是上一点中“包含多个函数指针的数组”。

1 void (*(*p3)[2])(int a, int b);  //无非就是将p2用*p3代替
2 p3 = &p2;              //指针赋值前必须要初始化
3 (*p3)[1] = add;
4 (*p3)[1](1, 2);          //调用
5 ((*p3)[1])(1, 2);

c++11可以很简单的这样直接定义:auto p3 = &p2; 代替了void (*(*p3)[2])(int a, int b)= &p2;

4、返回值为函数指针的函数:

  这个语法是需要记住的:这个函数的名字是func,返回值是为一个拥有两个int参数、返回类型为int的函数指针:

1 int (*func(char op)) (int , int)
2 {
3     return 1;
4 }

5、函数指针和typedef:

  typedef int (*fp)(int,int);  //定义一个函数指针类型,对应的是返回值为int,参数列表为两个int的函数

1 int add(int a, int b)
2 {
3     return a + b;
4 }

假如有一个add函数,那么我们可以直接声明一个函数指针:

  fp myPtr=add;

这样的话更符合我们一般的思维方式,这里fp相当于int,double这种类型。

原文地址:https://www.cnblogs.com/decade-dnbc66/p/5388995.html