【C/C++】函数指针和指针函数区分

2,252 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

函数指针和指针函数

函数指针和指针函数的区分是新手包括老手也不一定能区分的了的两个容易混淆的概念,这种问题一般面试的话,提前背一背八股文比较好,容易混淆不代表不会用。

一般而言 函数指针 多用于函数回调,是C语言中使用较多的一种方式。当然,涉及指针的东西都是C语言的,折磨了一届又一届的新手程序员们。

指针函数就是返回指针,简单记住即可。

参考了@函数指针和指针函数用法和区别_luoyayun361的专栏-CSDN博客_指针函数

指针函数

指针函数一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有“函数返回值”,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。

  • 指针函数:简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。

    • int *fun(int x,int y);
      int * fun(int x,int y)int* fun(int x,int y);
          
      // 使用
      typedef struct _Data{
          int a;
          int b;
      }Data;
          
      //指针函数
      Data* f(int a,int b){
          Data * data = new Data;
          data->a = a;
          data->b = b;
          return data;
      }
          
      int main(int argc, char *argv[])
      {
          QApplication a(argc, argv);
          //调用指针函数
          Data * myData = f(4,5);
          qDebug() << "f(4,5) = " << myData->a << myData->b;
          
          return a.exec();
      }
      

函数指针

函数指针是指向函数的指针变量。

因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。

  • 函数指针:其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。

    • int (*fun)(int x,int y);
              
      // 使用
      int add(int x,int y){
          return x+y;
      }
      int sub(int x,int y){
          return x-y;
      }
      //函数指针
      int (*fun)(int x,int y);
              
      int main(int argc, char *argv[])
      {
          QApplication a(argc, argv);
          //第一种写法
          fun = add;
          qDebug() << "(*fun)(1,2) = " << (*fun)(1,2) ;
      	//第二种写法
          fun = &sub;
          qDebug() << "(*fun)(5,3) = " << (*fun)(5,3)  << fun(5,3);
              
          return a.exec();
      }
      

如果你对这两个概念的区分不是很清晰也可以这么记:

指针函数与整型函数一样,都是返回一个东西,不同的是指针函数返回的是一个指针。