C语言—理解函数指针以及它的用法

什么是函数指针?



指针前面已经写过好多,自以为认识的差不多了,但是今天突然看到一个问题,写一个函数指 针,函数指针就是一个指向函数首地

址的指针,接下来写几个指针:


写一个函数指针

写一个函数指针数组

写一个指向函数指针数组的指针

看到这三个是不是觉得挺绕~


==》定义函数指针




举个例子看以下代码:

  1. #include<stdio.h>
  2. #include<Windows.h>
  3. void fun()
  4. {
  5. printf( "我调用成功了\n");
  6. }
  7. int main()
  8. {
  9. void(*pfun)() = &fun;
  10. (*pfun)();
  11. system( "pause");
  12. return 0;
  13. }

运行结果是什么呢?


这个就是一个函数指针的声明


==》如何定义一个函数指针数组?



以前我写过一个博客介绍数组指针和指针数组的区别,我们应该知道函数指针数组,是每一个元素 为函数指组的数组,对它是数

组。

现在来看看他的用法:


  1. #include<stdio.h>
  2. #include<Windows.h>
  3. void fun1()
  4. {
  5. printf( "我调用成功了\n");
  6. }
  7. void fun2()
  8. {
  9. printf( "我第二次调用成功了\n");
  10. }
  11. void fun3()
  12. {
  13. printf( "我第三次调用成功了\n");
  14. }
  15. int main()
  16. {
  17. void(*pfun)() = &fun1;
  18. void(*pfun2)() = &fun2;
  19. void(*pfun3)() = &fun3;
  20. //接下来就是定义一个数组把他们三个装进去。
  21. void(*pfunarr[ 3])();
  22. //在这里呢看着个指针数组,他就是一个具有3个以函数指针为内容的元素的函数指针数组。
  23. pfunarr[ 0] = &pfun ;
  24. pfunarr[ 1] = &pfun2;
  25. pfunarr[ 2] = &pfun3;
  26. pfunarr[ 0]();
  27. pfunarr[ 1]();
  28. pfunarr[ 2]();
  29. system( "pause");
  30. return 0;
  31. }

那我们一起来看看运行结果



很多人疑惑那个声明是怎么写出来的,如果你定义一个整形数组呢?  int arr[3]。 那么我们刚刚知道函数指针类型 怎么写?

void (*pfun)()  这个函数指针类型想把它变成数组就去找那个名字往它后面加一个[3]  就ok了~  也就是    void(*pfun[3])(); 


==》定义一个指向 指针数组的指针

上面我们已经发现规律,那我再看如下代码~

  1. #include<stdio.h>
  2. #include<Windows.h>
  3. void fun1()
  4. {
  5. printf( "我调用成功了\n");
  6. }
  7. void fun2()
  8. {
  9. printf( "我第二次调用成功了\n");
  10. }
  11. void fun3()
  12. {
  13. printf( "我第三次调用成功了\n");
  14. }
  15. int main()
  16. {
  17. //void(*pfun)() = &fun1;
  18. //void(*pfun2)() = &fun2;
  19. //void(*pfun3)() = &fun3;
  20. //接下来就是定义一个数组把他们三个装进去。
  21. void(*pfunarr[ 3])();
  22. void(*(*pfunarr2)[ 3])();
  23. //在这里呢看着个指针数组,他就是一个具有3个以函数指针为内容的元素的函数指针数组。
  24. pfunarr[ 0] = &fun1;
  25. pfunarr[ 1] = &fun2;
  26. pfunarr[ 2] = &fun3;
  27. pfunarr2 = &pfunarr;
  28. (*pfunarr2)[ 0]();
  29. pfunarr[ 0]();
  30. system( "pause");
  31. return 0;
  32. }


再看看结果~



我们把那个声明拿下来 分析一下

void (*(*pfunarr2)[3])();

首先呢,把  (*pfunarr2)[3]  这一段代码先去掉。

(*pfunarr2)[3] 这段代码很明显就是一个指针数组的原型。

那么它剩下来的部分是 void (*)() 这个是一个指向函数的指针原型。 所以他两个拼在一起 

void (*(*pfunarr2)[3])();

就叫做指向函数指针数组的指针。

这里这些听起来特别绕,但是呢你自己理解了,它们拿出来其实就都挺简单的喽。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值