嗯,让我们彻底搞懂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

相关文章
|
26天前
|
缓存 安全 编译器
C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者
《C++面试冲刺周刊》第三期聚焦指针与引用的区别,从青铜到王者级别面试回答解析,助你21天系统备战,直击高频考点,提升实战能力,轻松应对大厂C++面试。
77 10
C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者
|
27天前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
140 12
|
9月前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
252 1
|
10月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
534 4
|
11月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
11月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
154 2
|
11月前
|
存储 C++ 索引
C++函数指针详解
【10月更文挑战第3天】本文介绍了C++中的函数指针概念、定义与应用。函数指针是一种指向函数的特殊指针,其类型取决于函数的返回值与参数类型。定义函数指针需指定返回类型和参数列表,如 `int (*funcPtr)(int, int);`。通过赋值函数名给指针,即可调用该函数,支持两种调用格式:`(*funcPtr)(参数)` 和 `funcPtr(参数)`。函数指针还可作为参数传递给其他函数,增强程序灵活性。此外,也可创建函数指针数组,存储多个函数指针。
230 6
|
11月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
356 1
|
11月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
157 1
|
12月前
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
189 3