首页 > 编程语言 > 详细

C++中的函数指针

时间:2016-02-13 21:49:47      阅读:278      评论:0      收藏:0      [点我收藏+]

寒假这些天在看《The C++ Programming Language, 3rd

今天看到Chapter7 Function,里头好一些东西是C语言里没有的,比如overload、passing by reference。这里不讲这些,讲C语言也有的 pointer to function。以前学C语言的时候,简单学过pointer to function,还在大一用过那么一会。当时是在MCS-51上的delay函数,因为发现while语句与for语句在相同参数下花费时间不一样,写了一个小程序验证强化对比我的直观感受。代码如下:

技术分享
 1 #include <reg51.h>
 2 
 3 sbit beep = P2^3;
 4 
 5 void delayms_v1(unsigned int);
 6 void delayms_v2(unsigned int);
 7 void delayms_v3(unsigned int);
 8 void delayms_v4(unsigned int);
 9 
10 // void leftmove();
11 // void leftmove_one();
12 void leftmove_one_test();
13 
14 void main()
15 {
16     leftmove_one_test();
17 
18 }
19 
20 // void leftmove()
21 // {
22 //     P1 = 0xFE;
23 //     while (1)
24 //         if (P1 == 0) {
25 //             P1 = 0xFF;
26 //             delayms_v1(500);
27 //         } else {
28 //             P1 = P1 << 1;
29 //             delayms_v1(500);
30 //         }
31 // }
32 
33 void leftmove_one_test()
34 {
35     unsigned char apoint, pos, i;
36     void (*delay_funcs[4])(unsigned int) = {delayms_v2, delayms_v3, delayms_v4, delayms_v1 };
37 
38     for (i = 0; i < 4; i++) {
39         apoint = 1;
40         for (pos = 0; pos < 8; pos++) {
41             P1 = ~apoint;
42             beep = 0;
43             (*delay_funcs[i])(10);
44             beep = 1;
45             apoint = apoint << 1;
46             (*delay_funcs[i])(500);
47         }
48     }
49 }
50 /*        
51 void leftmove_one()
52 {
53     unsigned char apoint = 1;
54     while (1)
55         if (apoint == 0)
56             apoint = 1;
57         else {
58             P1 = ~apoint;
59             beep = 0;
60             delayms_v3(10);
61             beep = 1;
62             apoint = apoint << 1;
63             delayms_v3(480);
64         }
65 } */
66 void delayms_v1(unsigned int time)
67 {
68     unsigned char i = 110;
69     while (time--)
70         while (i--);
71 }
72 void delayms_v2(unsigned int time)
73 {
74     unsigned char i;
75     while (time--)
76         for (i = 0; i < 110; i++);
77 }
78 void delayms_v3(unsigned int time)
79 {
80     unsigned char i, j;
81     for (i = time; i > 0; i--)          //为什么不可以写成 for (i = 0; i < time; i++) ???
82     //for (i = 0; i < time; i++)
83         for (j = 0; j < 110; j++);
84 }
85 void delayms_v4(unsigned int time)
86 {
87     unsigned char i = 0;
88     while (time--)
89         for (i; i < 110; i++);
90 }
View Code

以上代码有严重bug,当时怎么也想不明白,现在一眼看得出。不过我还是不想改,就这样原封不动贴出来比较好。

言归正传,看完bj大大的文字与代码,确实感触良多。这里只讲其中一小点(一个Chapter里的一个section里的一小点:-) )。
这里用这章的exercise 1做展开(其实只是我做这道题遇到一些bj大说的silly mistakes,想记录而已,哈哈)。

这道题要我写几个declarations,第一个:a function taking arugments of type pointer to character and reference to integer and returning no value.
这个好办。

1 void f1(char*, int&);

第二个:a pointer to such a function.
这个也好办。

void (*pf1)(char*, int&);

第三个:a function taking such a pointer as an argument.
这个我真想了挺久的(这就是我写这篇博客的最初动机)。后来看到题目后面的hint:Use typedef 才恍然大悟。连同第四个:a function returning such a pointer。这四个declaration如下:

typedef void FUNC(char*, int&);
FUNC f1;
FUNC (*pf1);
void f2(FUNC*);
FUNC* f3();

本着人道主义精神,我还是把整个文件贴出来吧...

技术分享
 1 #include <iostream>
 2 #include <string>
 3 #include <typeinfo>
 4 using namespace std;
 5 
 6 typedef void FUNC(char*, int&);
 7 FUNC f1;
 8 FUNC (*pf1);
 9 void f2(FUNC*);
10 FUNC* f3();
11 
12 int main()
13 {
14     char str[] = "hello";
15     int i = 2;
16     f1(str, i);
17     pf1 = f3();
18     pf1(str, i);
19     f2(f1);
20 
21     return 0;
22 }
23 
24 void f1(char* st, int& it)
25 {
26     cout << "type of " << st << " is " << typeid(st).name() << endl;
27     cout << "type of " << it << " is " << typeid(it).name() << endl;
28 }
29 
30 void f2(FUNC* foo)
31 {
32     char xi[] = "xixi";
33     int haha = 3;
34     foo(xi, haha);
35 }
36 
37 FUNC* f3()
38 {
39     return f1;
40 }
View Code

 

C++中的函数指针

原文:http://www.cnblogs.com/numbaa/p/5188293.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!