1. 通常的函数调用和通过函数指针变量调用函数

先看两段代码

  1. //代码7.1
  2. #include <iostream>
  3. using namespace std;
  4. void MyFun(int x);
  5. int main()
  6. {
  7. MyFun(10);
  8. }
  9. void MyFun(int x)
  10. {
  11. cout << x << endl;
  12. }
  13. //代码7.2
  14. #include <iostream>
  15. using namespace std;
  16. void MyFun(int x);
  17. void (*FunP)(int );
  18. int main()
  19. {
  20. MyFun(10);
  21. FunP = &MyFun;
  22. (*FunP) (20);
  23. }
  24. void MyFun(int x)
  25. {
  26. cout << x << endl;
  27. }

代码7.1的运行截图:
image.png

代码7.2的运行截图:
image.png
比较两段代码,结合前几篇笔记,发现MyFun好像是一个int型变量,FunP好像是一个int型的指针变量,这是我的感觉

2.调用函数的其他写法
说实话,看到这几种写法确实填充了我的知识漏洞,第一次知道可以有那么多调用方式

  1. //代码7.3
  2. #include <iostream>
  3. using namespace std;
  4. void MyFun(int x);
  5. void (*FunP)(int );
  6. int main()
  7. {
  8. MyFun(10);
  9. //FunP = &MyFun;
  10. FunP = MyFun; //新的写法
  11. FunP(20); //还有这一行
  12. //(*FunP)(20);
  13. }
  14. void MyFun(int x)
  15. {
  16. cout << x << endl;
  17. }
  18. //代码7.4
  19. #include <iostream>
  20. using namespace std;
  21. void MyFun(int x);
  22. void (*FunP)(int );
  23. int main()
  24. {
  25. MyFun(10);
  26. FunP = &MyFun;//注意新的写法
  27. //FunP = MyFun;
  28. FunP(20);//还有这一行
  29. //(*FunP)(20);
  30. }
  31. void MyFun(int x)
  32. {
  33. cout << x << endl;
  34. }
  35. //代码7.5
  36. #include <iostream>
  37. using namespace std;
  38. void MyFun(int x);
  39. void (*FunP)(int );
  40. int main()
  41. {
  42. MyFun(10);
  43. //FunP = &MyFun;
  44. FunP = MyFun;
  45. //FunP(20);
  46. (*FunP)(20);
  47. }
  48. void MyFun(int x)
  49. {
  50. cout << x << endl;
  51. }

以上所有代码均可以运行,且运行结果正确
另外:

//代码7.6
#include <iostream>

using namespace std;

void MyFun(int x);

int main()
{
    (*MyFun)(10);//注意这行
}

void MyFun(int x)
{
    cout << x << endl;
}

注意与7.1代码的比较,发现调用MyFun函数又多了一种
总结思考:
1)其实,MyFun 的函数名与 FunP 函数指针都是一样的,即都是函数指针。 MyFun 函数名是一个函数指针常量,而 FunP 是一个函数数指针变量,这是它 们的关系。
2)但函数名调用如果都得如(*MyFun)(10)这样,那书写与读起来都是不方便和不习惯的。所以 C 语言的设计者们才会设计成又可允许 MyFun(10)这种 形式地调用(这样方便多了并与数学中的函数形式一样,不是吗?)。
3)为统一起见,FunP 函数指针变量也可以 FunP(10)的形式来调用。
4)赋值时,即可 FunP = &MyFun 形式,也可 FunP = MyFun。

  1. 定义某一函数的指针类型
    ```cpp //代码7.7

    include

using namespace std;

void MyFun(int ); void typedef (*FunType)(int );

int main() { MyFun(10); FunType FunP; FunP = &MyFun;//FunP = MyFun;也可以 FunP(20); (*FunP)(30); }

void MyFun(int x) { cout << x << endl; }

下面是程序运行截图<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23214581/1637218416749-fc49773d-d7f5-4a66-8cc6-853817b624e4.png#clientId=uc341931b-f445-4&from=paste&id=u78217047&margin=%5Bobject%20Object%5D&name=image.png&originHeight=304&originWidth=835&originalType=binary&ratio=1&size=24458&status=done&style=shadow&taskId=u65a140fa-095d-45bf-9fb7-ae547b79d11)<br />分析如下:<br /> 首先,在 void (*FunType)(int)前加了一个 typedef 。这样只是定 义一个名为 FunType 函数指针类型,而不是一个 FunType 变量。 然后,“FunType FunP;”声明一个 FunP 变量。 有了 FunType 类型后,我们就可以同样地、很方便地用 FunType 类型来 声明多个同类型的函数指针变量了。如下: FunType FunP2; FunType FunP3;  

4. 函数指针作为某个函数的参数 <br /> <br />我们先来看一段代码
```cpp
//代码7.8
#include <iostream>

using namespace std;

void MyFun1(int x);
void MyFun2(int x);
void MyFun3(int x);
typedef void (*FunType)(int ); /* 2. 定义一个函数指针类型FunType,与1函数类型一致 */
void CallMyFun(FunType myfun,int x);

int main()
{
    CallMyFun(MyFun1,10); /* 5. 通过 CallMyFun 函数分别调用三个不同的函数 */
    CallMyFun(MyFun2,20);
    CallMyFun(MyFun3,30);
}

void MyFun1(int x)/* 1. 这是个有一个参数的函数,以下两个函数也相同。 */
{
    cout << x << endl;
}

void MyFun2(int x)
{
    cout << x << endl;
}

void MyFun3(int x)
{
    cout << x << endl;
}

void CallMyFun(FunType myfun,int x)/* 3. 参数 fp 的类型是FunType。*/
{
    //(*myfun)(x);/* 4. 通过 myfun 的指针执行传递进来的函数,注意 myfun 所指的函数是有一个参数的。 */ 
    myfun(x);//上面写法一样正确
}

可以按照注释1-5的顺序进行分析
代码7.8的运行结果如下所示

10
20
30