指针函数与函数指针
1. 指针函数
指针函数的本质是一个函数,这个函数返回一个指针类型的数据,即返回一个地址。
指针函数的定义形式为:
类型名 *函数名(参数列表)
很多字符串处理函数都是指针函数,返回一个字符指针
例如:
char *strncpy(char *dest, const char *src,size_t n);
返回一个指向dest字符串首地址的字符指针
char *strncat(char *dest, const char *src,size_t n);
返回值同上
2. 函数指针
函数指针的本质是一个指针,这个指针指向函数的入口地址。
1) 定义函数指针
函数指针的定义形式为:
<类型名> (*<指针变量名>)(参数列表)
注意:*外别忘了括号()。
再定义一个函数指针时,要保证这个指针与所代表的函数的返回值类型一样,参数列表一样。
例如:
定义一个函数指针指向一个函数,该函数定义如下:
int fun(int i, int j);
只需将fun改为(*p)即可
int (*p)(int i,int j);
2) 使用函数指针调用函数
示例:写一个函数,求出2个数的和。调用函数用函数指针实现。
#include <stdio.h>
int add(int i, int j);
int main(int argc, const char *argv[])
{
intm, n;
intsum;
int(*p)(int i, int j);
p= add;
m= 3, n = 4;
sum= p(m, n);
printf("sum= %d\n",sum);
return0;
}
int add(int i, int j)
{
returni + j;
}
3. 如何更好的区分数组指针与指针数组,函数指针与指针函数
在上一篇博客中介绍了数组指针与指针数组,这篇介绍了函数指针与指针函数,可能有人会被这些名词绕晕。这里有几个点能够帮助理解区分他们。
1) 组合名词最后一个名词是主语是本质
数组指针 : 主语是指针,它的本质是指针
指针数组:主语是数组,它的本质是数组
函数指针:主语是指针,它的本质是指针
指针函数:主语是函数,它的本质是函数
2)*外有括号才是指针
int (*p)[m];
int *p[m];
因为 * 优先级低于 [],所以只有 * 外有 () , p才能先与 *结合,p才是一个指针。* 外没有 ()时,p先与 [] 结合,p就是一个数组。
int (*p)(int i,int j);
int *p(int i,int j);
因为 * 优先级低于 (), * 外有 (), p才能先与 *结合,p才是一个指针。* 外没有 ()时,p先与(int i,int j) 结合,p就是一个函数。
注:函数指针还可以再举例子加以说明,以后再补。