C++笔记 指针函数与函数指针详解

C++笔记 指针函数与函数指针详解,第1张

1.指针函数

指针函数,从名字上看它本质上是一个函数。


指针函数:返回值类型是指针的函数。


函数声明如下:


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;
}

 

 

这样执行也是没问题的啊,日常开发中,我还真没找到指针函数的“优点”,让我觉得某个功能必须用指针函数实现,或用指针函数实现后代码更整洁,提高代码可读性。


2.函数指针

函数指针,本质上他是一个指针,并不是一个函数。


在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语言中的最常见形态。


之前的例子只是为了让你更能理解函数指针,实际开发中只需要用函数指针的最终,最常见的形态即可。


不然代码中出现之前的形式,其他程序员并不是很熟悉,就成了“骚 *** 作”,虽然不影响运行,但是降低代码的可阅读性。


既然函数指针变量是一个变量,当然也可以作为某个函数的参数来使用的。


所以,你还应知道函数指针是如何作为某个函数的参数来传递使用的。


回调函数(以函数指针为参数的函数)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/569277.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存