一、数组指针
数组名本身就是一个指针,指向数组的首地址(如int (*p)[10]
表示一个指向10个int元素的数组的一个指针。)注意这是声明定长数组时,其数组名指向的数组首地址是常量。而声明数组并使某个指针指向其值指向某个数组的地址(不一定是首地址),指针取值可以改变。
二、函数指针
函数指针就是一个指向某一类型函数的指针int (*p)(int,int); //p为指向返回int型,带两个int型参数的函数的指针。函数指针是指向函数的指针变量。因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上一致的。函数指针有两个用途:调用函数和做函数的参数。
三、函数指针数组
函数指针数组是一个其元素是函数指针的数组。那么也就是说,此数据结构是是一个数组,且其元素是一个指向函数入口地址的指针。首先说明是一个数组:数组名[] 其次,要说明其元素的数据类型指针:*数组名[]. 再 次,要明确这每一个数组元素是指向函数入口地址的指针:函数返回值类型 ?*数组名[])().请注意,这里为什么要把“*数组名[]”用括号扩起来呢?因为圆括号和数组说明符的优先级是等同的,如果不用圆括号把指针数组说明 表达式扩起来,根据圆括号和方括号的结合方向,那么 *数组名 说明是元素返回值类型为指针的函数数组。不知道是不是有这样的函数数组,所以必须括起来,以保证数组的每一个元素是指针。
四、指向函数指针数组的指针和定义
用函数指针变量调用函数可以用指针变量指向整形变量、字符串、数组、结构体、也可以指向一个函数。一个函数在编译时被分配一个入口地址,这个入口地址就称为函数指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。指向函数的指针变量的一般定义形式为: int (*p)(test)这里数据类型就是函数返回值的类型。
五、回调函数的使用
回调函数分三步:注册回调函数、消息事件触发回调函数、执行回调函数。通常以库的形式,供别人调用实现。回调函数就是本模块实现的回调函数,但是调用却不是自己来调,而是由别的模块来调的,可更好的把握调用函数的时机,回调函数依赖对应注册回调的模块,回调函数由该模块触发,触发的条件、时间点,都是由该模块控制,在不同模块间进行使用,可令触发逻辑与业务逻辑分离,让代码功能性上更为清晰易懂。