函数指针

函数指针#

  • 获取函数地址
    • 只要使用函数名。如果think()是一个函数。think就是该函数的地址。
  • 声明一个函数指针
    • 声明指向某种数据类型的指针时,必须指定指针指向的类型。
    • 声明指向函数的指针时,也必须指定指针指向的函数类型。
    • 需要指定函数的返回类型和参数列表。
    • 例如一个函数 double pam(int a);
    • 该函数指针应声明为double (* pf)(int);
    • 注意与double * pf(int)的区别。前面的是函数指针,后面的是返回值为double *的函数。
    • 正确声明之后,赋值pf = pam;
    • 如果pf和pam的返回类型或参数列表不同,编译器将报错。
  • 使用函数指针调用函数
    • 调用函数指针指向的函数可以使用double y = (* pf)(5);
    • c++中也可以使用double x = pf(5);
    • 为何(* pf)与pf等价是一个问题。
  • 声明函数组
    • 例如const double * (*pa[3])(const double * , int) = {f1, f2, f3};(f1,f2,f3是函数地址);
    • 自动类型推断只能用于单值初始化,不能用于初始化列表。
    • 调用函数组中的函数const double * px = pa[0](av, 3);或const double * py = (*pa[1])(av, 3);
    • 创建整个函数组的指针
    • auto pc = &pa;
    • const double ((*pd)[3])(const double *, int) = &pa;
    • pa和&pa之间的差别
      • 对于pa代表数组中第一个元素的地址
      • &pa代表整个数组的地址
      • 想要得到数组第一个元素的值需要对pa解除一次引用
      • 但需要对&pa做两次引用
      • **&pa = *pa = pa[0]
  • 调用函数组中的函数指针
    • 较简单的方法(*pd)[i](av, 3); (pd)[i](av, 3);为返回指针指向的值。
    • 第二种使用指针调用((pd)[i])(av, 3); ((*pd)[i])(av, 3);为返回指针指向的值。
    • 类的虚函数通常使用了这样的技术。
  • 还可以使用typedef进行简化
posted @ 2019-12-02 23:07  yangzixiongh  阅读(136)  评论(0编辑  收藏  举报