指针函数,从名字上看它本质上是一个函数。
指针函数:返回值类型是指针的函数。函数声明如下:
int *plusfunction(int a,int b);
当然也可以写成如下格式:
int* plusfunction(int a,int b);
让指针标志 * 与int 紧贴在一起,而与函数名f间隔开,这样看起来就明了些了,plusfunction是函数名,返回值类型是一个int类型的指针。
指针函数就是一个普通的函数,普通到仅仅是因为它的函数返回值是指针而已。这和上面那个函数唯一的区别就是在函数名前面多了一个*号,而这个函数就是一个指针函数。其返回值是一个 int 类型的指针,是一个地址。
//指针函数,从名字上看它本质上是一个函数。
//指针函数:返回值类型是指针的函数。
#include
#include
int* plusfunction(int a, int b);
int main()
{
int *p = NULL;
p = plusfunction(1, 2);
printf("*p is %d\n", *p);
free (p);
system("pause");
return 0;
}
int* plusfunction(int a, int b)
{
int *p = (int *)malloc(sizeof(int));
*p = a + b;
return p;
}
不过我有个疑问,使用指针函数,和函数入参是指针,这两者对比使用,第一种方法有什么好处呢???
下面展示函数入参是指针
#include
#include
void plusfunction(int a, int b, int *p);
int main()
{
int *p = NULL;
p = (int *)malloc(sizeof(int));
plusfunction(1, 8, p);
printf("*p is %d\n", *p);
free(p);
system("pause");
return 0;
}
void plusfunction(int a, int b, int *p)
{
*p = a + b;
}
这样执行也是没问题的啊,日常开发中,我还真没找到指针函数的“优点”,让我觉得某个功能必须用指针函数实现,或用指针函数实现后代码更整洁,提高代码可读性。
函数指针,本质上他是一个指针,并不是一个函数。在C语言中有些概念是一脉相承的。
函数指针说的就是一个指针,但这个指针指向的是函数,不是普通的基本数据类型或者类对象。函数指针定义如下:
int (*f)(int a,int b);//声明函数指针
和指针函数的定义对比可以看到,
函数指针与指针函数的最大区别是函数指针的函数名是一个指针,即函数名前面有一个指针类型的标志型号“*”。
注意指针函数与函数指针表示方法的不同,千万不要混淆。
最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。
当然,函数指针的返回值也可以是指针。
#include
void MyFun(int a);
int main()
{
MyFun(10);
return(0);
}
void MyFun(int a)
{
printf("a is %d\n",a);
}
#include
#include
void MyFun(int a);
int main()
{
(*MyFun)(10);
system("pause");
return 0;
}
void MyFun(int a)
{
printf("a is %d\n", a);
}
这个代码是正常运行的,也就是说(*MyFun)(10);和MyFun(10);是一样的,在教材和资料中,都会讲到数组名就是指向数组第一个数据的常量指针。从上面例子看到,函数名貌似也是“常量指针”。
#include
#include
void MyFun(int a);// 这个声明也可写成:void MyFun( int )
void(*FunP)(int);//也可声明成void(*FunP)(int x),但习惯上一般不这样。
int main()
{
FunP = MyFun;
(*FunP)(100);
system("pause");
return 0;
}
void MyFun(int a)
{
printf("a is %d\n", a);
}
#include
#include
void MyFun(int a);// 这个声明也可写成:void MyFun( int )
void(*FunP)(int);//也可声明成void(*FunP)(int x),但习惯上一般不这样。
int main()
{
FunP = MyFun;
FunP(100);
system("pause");
return 0;
}
void MyFun(int a)
{
printf("a is %d\n", a);
}
是的,将FunP前面的*号拿掉也是可以运行的,上面的示例代码就是函数指针在C语言中的最常见形态。之前的例子只是为了让你更能理解函数指针,实际开发中只需要用函数指针的最终,最常见的形态即可。
不然代码中出现之前的形式,其他程序员并不是很熟悉,就成了“骚操作”,虽然不影响运行,但是降低代码的可阅读性。
既然函数指针变量是一个变量,当然也可以作为某个函数的参数来使用的。所以,你还应知道函数指针是如何作为某个函数的参数来传递使用的。
回调函数(以函数指针为参数的函数)