天天看点

C 函数指针 函数指针数组 转移表

内容来自《c和指针》,整理后方便个人理解

cdel程序可以方便的给出声明的释义

f is pointer to function returning int

第2个括号是函数调用操作符。第1个括号起到聚组的作用,迫使间接访问在函数调用之前进行,使f成为一个函数指针。f指向的函数返回一个整型值。

g is pointer to function returning pointer to int

和上面的大致相同,区别在于g指向的函数返回一个指向整型指针

为了进一步理解“迫使间接访问在…之前进行”,再举例说明

abc is pointer to array 0…5 of int

先对括号内的*abc求值:迫使间接访问在创建数组之前进行,使abc成为一个指针,abc指向一个数组,数组元素类型是int

f is array 0…9 of pointer to int
f is array of pointer to function returning int

先对*f[]求值:f是数组,元素类型是某种类型的指针

末尾的()是函数调用操作符

f的元素类型是函数指针,指向的函数的返回值是整型

作为参数传递给另一个函数

callback function

概念:把一个函数指针作为参数传递给其他函数,后者将回调用户的函数。

应用场合:

函数需要在不同时刻执行不同类型的工作

执行只能由函数调用者定义的工作

下面这个例子就是用函数指针实现的可以自定义类型的排序函数sort

如果switch操作符的代码是从0开始连续的整数,可以用一个转移表来完成switch语句完成的任务

C 函数指针 函数指针数组 转移表

如果不是从0开始的连续整数,这种情况更合适switch语句。

因为在访问转移表之前,还需要一系列操作把操作符转换为合适的下标。

在转移表,越界访问是十分危险的,测试很难发现bug究竟在哪里,一开始就应该保证转移表使用的下标位于合法的范围内

使用转移表时应添加注释,以弥补转移表的可读性缺陷

c