1.指针函数的定义
顾名思义,指针函数即返回指针的函数。其一般定义形式如下:
类型名 *函数名(函数参数表列);
其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个“指向返回值为…的指针(地址),“类型名”表示函数返回的指针指向的类型”。
“(函数参数表列)”中的括号为函数调用运算符,在调用语句中,即使函数不带参数,其参数表的一对括号也不能省略。其示例如下:
int *pfun(int, int);
由于“*”的优先级低于“()”的优先级,因而pfun首先和后面的“()”结合,也就意味着,pfun是一个函数。即:
int *(pfun(int, int));
接着再和前面的“*”结合,说明这个函数的返回值是一个指针。由于前面还有一个int,也就是说,pfun是一个返回值为整型指针的函数。
我们不妨来再看一看,指针函数与函数指针有什么区别?
int (*pfun)(int, int);
通过括号强行将pfun首先与“*”结合,也就意味着,pfun是一个指针,接着与后面的“()”结合,说明该指针指向的是一个函数,然后再与前面的int结合,也就是说,该函数的返回值是int。由此可见,pfun是一个指向返回值为int的函数的指针。
虽然它们只有一个括号的差别,但是表示的意义却截然不同。函数指针的本身是一个指针,指针指向的是一个函数。指针函数的本身是一个函数,其函数的返回值是一个指针。
2. 用函数指针作为函数的返回值
在上面提到的指针函数里面,有这样一类函数,它们也返回指针型数据(地址),但是这个指针不是指向int、char之类的基本类型,而是指向函数。对于初学者,别说写出这样的函数声明,就是看到这样的写法也是一头雾水。比如,下面的语句:
int (*ff(int))(int *, int);
我们用上面介绍的方法分析一下,ff首先与后面的“()”结合,即:
int (*(ff(int)))(int *, int); // 用括号将ff(int)再括起来
也就意味着,ff是一个函数。
接着与前面的“*”结合,说明ff函数的返回值是一个指针。然后再与后面的“()”结合,也就是说,该指针指向的是一个函数。
这种写法确实让人非常难懂,以至于一些初学者产生误解,认为写出别人看不懂的代码才能显示自己水平高。而事实上恰好相反,能否写出通俗易懂的代码是衡量程序员是否优秀的标准。一般来说,用typedef关键字会使该声明更简单易懂。在前面我们已经见过:
int (*PF)(int *, int);
也就是说,PF是一个函数指针“变量”。当使用typedef声明后,则PF就成为了一个函数指针“类型”,即:
typedef int (*PF)(int *, int);
这样就定义了返回值的类型。然后,再用PF作为返回值来声明函数:
PF ff(int);
下面将以程序清单1为例,说明用函数指针作为函数的返回值的用法。当程序接收用户输入时,如果用户输入d,则求数组的最大值,如果输入x,则求数组的最小值,如果输入p,则求数组的平均值。
程序清单 1 求最值与平均值示例
1 #include<stdio.h>
2 #include <assert.h>
3 double GetMin(double *dbData, int iSize) // 求最小值
4 {
5 double dbMin;
6 int i;
7
8 assert(iSize>0);
9 dbMin=dbData[0];
10 for (i=1; i<iSize; i++){
11 if (dbMin>dbData[i]) {
12 dbMin=dbData[i];
13 }
14 }
15 return dbMin;
16 }
17
18 double GetMax(double *dbData, int iSize) // 求最大值
19 {
20 double dbMax;
21 int i;
22
23 assert(iSize>0);
24 dbMax=dbData[0];
25 for (i=1; i<iSize; i++){
26 if (dbMax< dbData[i]) {
27 dbMax=dbData[i];
28 }
29 }
30 return dbMax;
31 }
32
33 double GetAverage(double *dbData, int iSize) // 求平均值
34 {
35 double dbSum=0;
36 int i;
37
38 assert(iSize>0);
39 for (i=0; i<iSize; i++)
40 {
41 dbSum+=dbData[i];
42 }
43 return dbSum/iSize;
44 }
45
46 double UnKnown(double *dbData, int iSize) // 未知算法
47 {
48 return 0;
49 }
50
51 typedef double (*PF)(double *dbData, int iSize); // 定义函数指针类型
52 PF GetOperation(char c) // 根据字符得到操作类型,返回函数指针
53 {
54 switch (c)
55 {
56 case 'd':
57 return GetMax;
58 case 'x':
59 return GetMin;
60 case 'p':
61 return GetAverage;
62 default:
63 return UnKnown;
64 }
65 }
66
67 int main(void)
68 {
69 double dbData[]={3.1415926, 1.4142, -0.5,999, -313, 365};
70 int iSize=sizeof(dbData)/sizeof(dbData[0]);
71 char c;
72
73 printf("Please input the Operation :\n");
74 c=getchar();
75 printf("result is %lf\n", GetOperation(c)(dbData,iSize)); // 通过函数指针调用函数
76 }
上述程序中前面4个函数分别实现求最大值、最小值、平均值和未知算法,然后实现了GetOperation函数。这个函数根据字符的返回值实现上面4个函数。它是以函数指针的形式返回的,从后面的main函数的GetOperation(c)(dbData, iSize)可以看出,通过这个指针可以调用函数。
分享到:
相关推荐
#### 三、深入理解指针 为了更好地理解上述各种类型的指针,我们还需要对它们进行更深入的探讨。 1. **指针的类型**:通过去除指针名称和其左侧的星号,我们可以确定指针的类型。例如,在`int *(*ptr(int))[3];`中...
### 指针深入理解:解析与应用 在计算机编程领域,尤其是C和C++语言中,指针是一个核心概念,它提供了对内存地址的直接访问能力,是实现...深入理解指针的特性和正确使用指针,是成为一名高效、安全的程序员的关键。
在这个“函数指针与指针函数应用程序”中,我们将深入探讨这两个核心主题。 首先,我们要理解函数指针。函数在C/C++中被视为对象,可以被赋值、传递和返回。函数指针就是一个指向函数的指针,它存储了函数在内存中...
在C语言中,指针和函数是两个非常重要的概念,而将...在阅读提供的《函数指针.pdf》和《C语言教程之 指针.PDF》文档时,你可以深入学习这两个概念的细节,包括如何声明、如何使用,以及它们在实际编程中的各种应用。
"深入理解C语言指针" 在C语言中,指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存...
【函数指针】是C语言中一种强大的特性,它允许我们使用指针来直接操作函数。函数在程序中被看作是一种数据类型,因此可以像处理其他数据...理解和熟练掌握这些概念对于深入理解C语言及其在复杂系统中的应用至关重要。
通过对指针函数的深入理解及应用,我们不仅可以写出更加简洁高效的代码,还能够在实际开发中解决许多复杂的问题。上述案例展示了如何通过函数指针数组的方式实现对多个类型相同函数的有效管理和调用,这种方法在处理...
### 指针函数与函数指针:深入解析与应用 #### 一、指针函数:函数返回指针的艺术 指针函数,顾名思义,是指那些返回值为指针类型的函数。这类函数通常用于返回某个数据结构的地址,如数组、结构体等,以便在函数...
### 函数指针与指针函数的理解 #### 一、函数指针与指针函数的基本概念 在C语言中,函数指针与指针函数是两个重要的概念,它们虽然听起来相似,但实际上有着明显的区别。 **函数指针**:是指向函数的指针,即它...
在深入探讨函数指针与指针函数之前,我们首先需要理解几个基础概念:变量、数组、指针以及它们之间的关系。 #### 变量与指针 变量是在内存中分配的一个存储区域,用于存放特定类型的数据。而指针是一种特殊的变量...
首先,理解指针函数的基本概念是至关重要的。一个指针变量可以存储一个内存地址,而指针函数则存储了一个函数的地址。当我们定义一个指针函数时,我们需要指定它所指向的函数的返回类型和参数列表。例如: ```c int...
指针是C/C++编程语言中的一个核心概念,它在程序设计中扮演着至关重要的角色。指针可以被视为存储内存地址的变量,这些地址指向其他数据类型...通过实践和深入理解指针的特性,开发者可以编写出更高效、更灵活的代码。
函数指针与数组指针的区别在于,函数指针指向的是代码段中的函数入口地址,而数组指针则指向数据段中的数组起始位置。但在使用形式上,函数指针可以像调用函数一样使用,通过在指针变量后加括号并传入参数来调用函数...
在学习C++的过程中,经常遇到的一个难点是理解和区分“指针函数”与“函数指针”。这两者虽然只有一词之差,但在概念和用法上有着本质的不同。下面我们将通过具体的解释和示例来详细探讨两者的区别。 #### 一、指针...
### 指针函数 #### 1. 概念与定义 指针函数是指返回值类型为指针类型的函数。这种函数返回一个内存地址,通常用于返回数组元素的地址或其他对象的地址。...掌握这些概念对于深入理解和应用C语言至关重要。
书中可能涵盖了指针与数组、指针与函数、指针与字符串等方面的内容,这些知识点对于编写高效的C代码至关重要。 指针与数组的关系是C语言中一个重要的主题。通过指针,我们可以遍历数组的每一个元素,进行快速访问和...
通过深入学习和实践C语言的函数指针和指针函数,不仅可以提升编程技巧,还能更好地理解和运用C语言的底层机制。这将对你的编程事业大有裨益,特别是在需要高效和低级操作的场合,如系统编程、游戏开发或者嵌入式系统...
本篇主要探讨C++中的指针,特别是涉及C与C++中函数指针和指针函数的使用。 首先,我们需要理解什么是指针。在C++中,指针是一个变量,它存储了另一个变量的内存地址。通过指针,我们可以直接访问和修改被指向的变量...
#### 指针与函数 指针可以作为函数参数传递,这允许函数直接修改调用者提供的变量。例如,交换两个变量的值: ```c void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } int main() { int x =...