函数指针的定义和用法
先回顾下数组的储存方式,当你在程序中定义了一个数组,那么系统就会自动根据你的数组类型和数组长度申请一块储存空间给你。而且数组名储存的地址刚好就是申请的这块储存空间的首地址,这也是为什么我们在输入字符串时不用&,因为下面的s数组名储存的就是首地址,不用再对它进行取地址符操作了。
char s[100];scanf ( "%s", s );
那么我们再来理解一下函数,与数组类似的,函数名储存的也是首地址。
函数指针不同于指针的地方就是函数指针所储存的地址为函数,而普通指针的地址为变量地址。
函数指针定义方式:int (*p)(int,int)函数返回值类型 (*指针变量名)(函数参数列表)函数定义方式:int func(int, int)函数返回值类型 函数名(函数参数列表)普通指针定义方式:int *p指针类型 指针名
与普通指针的定义方式不同,函数指针的定义方式如上,其中需要特别注意的是(*p)的括号千万不能省略,因为这个和运算符的优先级有关系。如果省略了括号,那么定义的就是一个函数返回值类型为指针的函数了。
普通指针的应用int a;p = &a;函数指针的应用p = func;//再次强调申明一下,因为函数名就代表了函数的首地址,所以不用像普通指针一样对变量用取地址符&
通过对比也可以知道函数指针的定义方式和函数的定义方式十分类似,区别就在于*
而函数指针的应用因为函数名默认储存首地址的特性也略有不同。
我们知道对于普通指针
*p = a
那么同样的,对于函数指针
(*p)(int, int) = func(int, int)
因此在一些特殊的场景,函数指针就能够发挥自己特点了。