指针和引用(5)函数指针

简介: 1.知识点(1)指针可以指向任何类型,也可以指向函数。每个函数在内存中都占用一段存储单元,这段存储单元的首地址称为函数的入口地址,指向之歌函数入口地址的指针称为函数指针。(2)函数基本用法如下:1 int max(int a, int b) {2 return a > b ? a ...

1.知识点

(1)指针可以指向任何类型,也可以指向函数。每个函数在内存中都占用一段存储单元,这段存储单元的首地址称为函数的入口地址,指向之歌函数入口地址的指针称为函数指针。

(2)函数基本用法如下:

1 int max(int a, int b) {
2     return a > b ? a : b;
3 }
4 int (*p)(int, int) = max;//定义函数指针时必须指明函数返回的类型和参数列表
5 int x = 10, y = 20;
6 int z = p(x, y);//可以直接把函数指针当做函数名来用,也可以用int z=(*p)(x,y);

注意:(2.1)函数名等价于函数的入口地址;(2.2)定义函数指针时()不能少,如果少了int *p(int,int)变成是一个函数,返回值是int *的函数,而不是指针了;(2.3)函数指针的类型务必要和函数的返回值以及参数列表都要匹配。

2.面试题

2.1通过函数指针实现四则运算

指出下面程序的不足,并提出更好的设计方案。

 1 int add(int a, int b) {
 2     return a + b;
 3 }
 4 int minu(int a, int b) {
 5     return a - b;
 6 }
 7 int multi(int a, int b) {
 8     return a * b;
 9 }
10 int process(int a, int b, char operation) {
11     switch (operation)
12     {
13     case '+':return add(a, b);
14     case '-':return minu(a, b);
15     case '*':return multi(a, b);
16     default:
17         return 0;
18     }
19 }
20 int main(int argc, char argv[]) {
21     int a = 10, b = 20;
22     int res1 = process(a, b, '+');
23     int res2 = process(a, b, '-');
24     int res3 = process(a, b, '*');
25     cout << res1 << " " << res2 << " " << res3 << endl;
26 
27     getchar();
28     return 0;
29 }

问题:扩展性很差,比如需要添加一个除法运算,这时不仅需要编写除法运算函数,还要去修改process函数,添加除法的判断分支。解决办法:可通过函数指针来提高扩展性(由于此处加减乘除的返回值和参数列表都是相同的),具体方式如下:

 1 int add(int a, int b) {
 2     return a + b;
 3 }
 4 int minu(int a, int b) {
 5     return a - b;
 6 }
 7 int multi(int a, int b) {
 8     return a * b;
 9 }
10 int divide(int a, int b) {
11     if (b == 0) {
12         return -1;
13     }
14     return a / b;
15 }
16 
17 int process1(int a, int b, int(*func)(int, int)) {
18     return func(a, b);
19 }
20 int main(int argc, char argv[]) {
21     int a = 10, b = 20;
22     int res1 = process1(a, b, add);
23     int res2 = process1(a, b, minu);
24     int res3 = process1(a, b, multi);
25     int res4 = process1(a, b, divide);
26     cout << res1 << " " << res2 << " " << res3 << " " << res4 << endl;
27     getchar();
28     return 0;
29 }

2.2简化超长的函数指针类型

请解释process函数中四个参数的作用,其中第四个参数int (* fun) (int,int,int)似乎不太美观,有什么办法让它看起来更加简洁?

1 int maxof3(int a,int b,int c);
2 int minof3(int a,int b,int c);
3 int avgof3(int a,int b,int c);
4 int process(int a,int b,int c,int (*func)(int,int,int)){return func(a,b,c);}

答案:前三个是整型变量,第四个是函数指针;使用typedef来给类型起别名,用法如下:

1 typedef int(* Pfunc)(int ,int, int);//使用Pfunc来指代int (*)(int,int,int)
2 int process(int a,int b,int c,Pfunc func);
相关文章
|
5月前
|
存储 安全 C++
C++中的引用和指针:区别与应用
引用和指针在C++中都有其独特的优势和应用场景。引用更适合简洁、安全的代码,而指针提供了更大的灵活性和动态内存管理的能力。在实际编程中,根据需求选择适当的类型,能够编写出高效、可维护的代码。理解并正确使用这两种类型,是掌握C++编程的关键一步。
74 1
|
6月前
|
C++
C++中的const指针与const引用
C++中的const指针与const引用
77 2
|
6月前
|
算法 C语言
通过指针引用数组
通过指针引用数组
50 1
|
6月前
|
算法 C语言
通过指针引用字符串
通过指针引用字符串
62 1
|
1月前
魔法指针 之 函数指针 回调函数
魔法指针 之 函数指针 回调函数
14 0
|
1月前
|
存储
一篇文章了解区分指针数组,数组指针,函数指针,链表。
一篇文章了解区分指针数组,数组指针,函数指针,链表。
18 0
|
4月前
|
存储 安全 C++
浅析C++的指针与引用
虽然指针和引用在C++中都用于间接数据访问,但它们各自拥有独特的特性和应用场景。选择使用指针还是引用,主要取决于程序的具体需求,如是否需要动态内存管理,是否希望变量可以重新指向其他对象等。理解这二者的区别,将有助于开发高效、安全的C++程序。
32 3
|
3月前
|
存储 程序员 C语言
指针的高级应用:指针数组、数组指针、函数指针等。
指针的高级应用:指针数组、数组指针、函数指针等。
110 0
|
5月前
|
存储 安全 编译器
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
66 5
|
5月前
|
存储 C语言 C++
指针进阶(函数指针)(C语言)
指针进阶(函数指针)(C语言)