嗯,让我们彻底搞懂C/C++函数指针吧(三)

简介:

3.6 使用函数指针数组

函数指针有意思的地方在于,它使用从0n-1这个n个连续的整数下标直接映射到函数上。

和前面一样,我们也是类比着定义普通指针数组来定义函数指针数组。首先,考虑一个浮点数指针数组,数组的长度为10.我们都知道用下面的形式来定义:

float * pFloatArray[10];

从形式上分析,用中括号明确了是定义指针变量还是定义指针数组这个语义。用数字10明确了这个数组能容纳多少个函数指针这个语义。形式上看,中括号是紧接在指针名称的后面再中括号里面是一个需要在编译时期间就能够确定的常数。

现在我们来类比函数指针数组的定义,定义一个指向函数指针类型为:float (*)(float,float)的函数指针数组,数组长度为10.正确的形式为:

float(* pFunctionArray[10])(float,float)

从形式上看,这种定义方式和定义普通指针的定义方式是一致的:都是在指针名称后面紧接着一个中括号,然后里面是一个编译期间能够确定的常数。这种形式上的一致性,可以方便我们对形式的记忆,进而达到对内容的理解。

下面是一个例子程序:

 

 
  1. /* 
  2.  
  3. *Author:Choas Lee 
  4.  
  5. *Date:2012-02-28 
  6.  
  7. */ 
  8.  
  9. #include<stdio.h> 
  10.  
  11. float add(float a,float b){return a+b;} 
  12.  
  13. float minus(float a,float b){return a-b;} 
  14.  
  15. float multiply(float a,float b){return a*b;} 
  16.  
  17. float divide(float a,float b){return a/b;} 
  18.  
  19. int main() 
  20.  
  21.  
  22.       float(*func_pointers[4])(float,float)={add,minus,multiply,divide}; 
  23.  
  24.       int i=0; 
  25.  
  26.       float a=10.0,b=5.0; 
  27.  
  28.       for(i=0;i<4;i++) 
  29.  
  30.       { 
  31.  
  32.              printf("result is %f\n",func_pointers[i](a,b)); 
  33.  
  34.       } 
  35.  
  36.       return 0; 
  37.  

以下为对应的运行结果:

 

 
  1. result is 15.000000 
  2.  
  3. result is 5.000000 
  4.  
  5. result is 50.000000 
  6.  
  7. result is 2.000000 

3.7 使用typedef

从哲学角度讲,形式过于复杂的话,还是抽象的层次太低。如果我们使用多层次的抽象,这样最上层的表示就会简化很多。这就是引入typedef的原因,使用typedef可以简化函数指针的定义,因为typedef可以定义新的类型:

同样,在使用typedef定义函数指针类型的时候,也和普通的使用typedef引入新类型的方式不一样。我们和前面一样对照着普通的定义方式来学习:

typedef int bool;

这在C语言中很常用,由于C语言中没有bool类型,这样定义之后可以从形式上引入一个bool类型,提高代码可读性。所以形式为:
       typedef 
已知类型 新类型;

现在我们要将float (*)(float,float)类型声明为一种新类型,按照上面的方式,貌似为:typedef float(*)(float,float) fpType;然而,前面的经验告诉我们应该这样定义啊:

typedef float(*fpType)(float,float);

这样我们就可以用fpType来表示float (*)(float,float)这种类型了。所以定义一个新的指向float (*)(float,float)类型的指针变量的时候,我们就可以采用下面这种形式了:

fpType pFunction;

在定义函数指针数组的时候可以这样定义:

fpType pFunctions[10];

在定义函数指针类型参数时可以这样定义:

void func(fpType pFunction);

在定义函数指针类型的返回值时可以这样定义:

fpType func(int a);

现在我们再来看一下,unix中的那个signal函数,其形式为:

void (*signal)(int signo,void (*func)(int)))(int);

现在我们定义一个类型为:

typedef void (*pSgnType)(int);

这样上面的函数就能表达为:

pSgnType signal(int signo,pSgnType func);

这样是不是看起来清爽多了。

其实上面的signal函数也能这样定义:

首先引入新类型:

typedef void SgnType(int)

然后signal函数的声明改为:

SgnType *signal(int signo,SgnType *func);

按照前面对这些形式的解释,理解这个应该没难度~~

现在在引入最后一个例子,关于使用typedef来简化函数指针定义的:

 

 
  1. /* 
  2.  
  3. *Author:Choas Lee 
  4.  
  5. *Date:2012-02-29 00:25 
  6.  
  7. */ 
  8.  
  9. #include<stdio.h> 
  10.  
  11. #include<stdlib.h> 
  12.  
  13. #include<string.h> 
  14.  
  15. float add(float a,float b){return a+b;} 
  16.  
  17. float minus(float a,float b){return a-b;} 
  18.  
  19. float multiply(float a,float b){return a*b;} 
  20.  
  21. float divide(float a,float b){return a/b;} 
  22.  
  23.   
  24.  
  25. typedef float (*pArithmeticOperations)(float,float); 
  26.  
  27. typedef float ArithmeticOperations(float,float); 
  28.  
  29.   
  30.  
  31. int main() 
  32.  
  33.  
  34.       pArithmeticOperations pao=add; 
  35.  
  36.       pArithmeticOperations paos[4]={add,minus,multiply,divide}; 
  37.  
  38.       
  39.  
  40.       ArithmeticOperations *ao=add; 
  41.  
  42.       ArithmeticOperations *aos[4]={add,minus,multiply,divide}; 
  43.  
  44.       float a=10.0,b=5.0; 
  45.  
  46.       float result=0.0; 
  47.  
  48.       int i=0; 
  49.  
  50.       result=pao(a,b); 
  51.  
  52.       printf("the result of pao is %f\n",result); 
  53.  
  54.       
  55.  
  56.       printf("the results of paos are:\n"); 
  57.  
  58.       for(i=0;i<4;i++) 
  59.  
  60.       { 
  61.  
  62.              result=paos[i](a,b); 
  63.  
  64.              printf("result=%f\n",result); 
  65.  
  66.       } 
  67.  
  68.       
  69.  
  70.       result=ao(a,b); 
  71.  
  72.       printf("\n\nthe result of ao is :%f\n",result); 
  73.  
  74.       
  75.  
  76.       printf("the results of aos are:\n"); 
  77.  
  78.       for(i=0;i<4;i++) 
  79.  
  80.       { 
  81.  
  82.              result=aos[i](a,b); 
  83.  
  84.              printf("result=%f\n",result); 
  85.  
  86.       } 
  87.  
  88.       return 0; 
  89.  

输出结果为:

 

 
  1. result=15.000000 
  2.  
  3. result=5.000000 
  4.  
  5. result=50.000000 
  6.  
  7. result=2.000000 
  8.  
  9.   
  10. the result of ao is :15.000000 
  11.  
  12. the results of aos are: 
  13.  
  14. result=15.000000 
  15.  
  16. result=5.000000 
  17.  
  18. result=50.000000 
  19.  
  20. result=2.000000 

 

时间不早了,该回去睡觉了~

引用:

Function pointer tutorial.



本文转自hipercomer 51CTO博客,原文链接:http://blog.51cto.com/hipercomer/792302

相关文章
|
存储 安全 算法
【C++智能指针 相关应用】深入探索C++智能指针:跨进程、动态库与最佳实践
【C++智能指针 相关应用】深入探索C++智能指针:跨进程、动态库与最佳实践
63 5
|
1月前
|
存储 安全 C++
在C++指针和引用
在C++指针和引用
|
1月前
|
安全 程序员 Linux
【C++】—— c++11之智能指针
【C++】—— c++11之智能指针
|
1月前
|
存储 程序员 C++
在C++编程语言中指针的作用类型
在C++编程语言中指针的作用类型
14 0
|
29天前
|
JSON JavaScript 前端开发
C++ 智能指针与 JSON 处理:高级编程技巧与常见问题解析
C++ 智能指针与 JSON 处理:高级编程技巧与常见问题解析
264 0
|
15天前
|
存储 C++
C++指针
C++指针
|
26天前
|
存储 编译器 C语言
【c++】类和对象(二)this指针
朋友们大家好,本节内容来到类和对象第二篇,本篇文章会带领大家了解this指针
【c++】类和对象(二)this指针
|
27天前
|
存储 编译器 C语言
【C++练级之路】【Lv.2】类和对象(上)(类的定义,访问限定符,类的作用域,类的实例化,类的对象大小,this指针)
【C++练级之路】【Lv.2】类和对象(上)(类的定义,访问限定符,类的作用域,类的实例化,类的对象大小,this指针)
|
29天前
|
存储 安全 数据库连接
【C++智能指针】深入探究C++智能指针:自定义删除器的设计与选择
【C++智能指针】深入探究C++智能指针:自定义删除器的设计与选择
82 0
|
29天前
|
存储 安全 编译器
【C++ 函数设计的艺术】深挖 C++ 函数参数的选择 智能指针与 std::optional:最佳实践与陷阱
【C++ 函数设计的艺术】深挖 C++ 函数参数的选择 智能指针与 std::optional:最佳实践与陷阱
108 0

热门文章

最新文章