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

1.指针函数

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

指针函数:返回值类型是指针的函数。函数声明如下:


int *plusfunction(int a,int b);

当然也可以写成如下格式:


int* plusfunction(int a,int b);

指针标志 * 与int  紧贴在一起,而与函数名f间隔开,这样看起来就明了些了,plusfunction是函数名,返回值类型是一个int类型的指针。

指针函数就是一个普通的函数,普通到仅仅是因为它的函数返回值是指针而已。这和上面那个函数唯一的区别就是在函数名前面多了一个*号,而这个函数就是一个指针函数。其返回值是一个 int 类型的指针,是一个地址。

//指针函数,从名字上看它本质上是一个函数。
//指针函数:返回值类型是指针的函数。


#include <stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <stdlib.h>
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 <stdio.h>
void MyFun(int a);
int main()
{
    MyFun(10);
    return(0);
}
void MyFun(int a)
{
    printf("a is %d\n",a);
}

 

#include <stdio.h>
#include<stdlib.h>
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 <stdio.h>
#include<stdlib.h>
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 <stdio.h>
#include<stdlib.h>
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语言中的最常见形态。之前的例子只是为了让你更能理解函数指针,实际开发中只需要用函数指针的最终,最常见的形态即可。

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

既然函数指针变量是一个变量,当然也可以作为某个函数的参数来使用的。所以,你还应知道函数指针是如何作为某个函数的参数来传递使用的。

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

  • 12
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
C中的指针函数函数指针是两个不同的概念。引用中提到,函数指针函数名是一个指针,即函数名前面有一个指针类型的标志型号“*”。函数指针的定义形式为`int (*f)(int a, int b)`,表示f是一个指向返回类型为int,参数为int和int的函数指针。引用指出,函数指针是指向函数指针,而不是指向普通的基本数据类型或类对象的指针。 而指针函数则是一个返回类型为指针函数指针函数的定义形式是:`int* function_name(int a, int b)`,表示function_name是一个返回类型为int指针,参数为int和int的函数指针函数返回的是一个指针,可以用于指向某个特定的数据类型或对象。 所以,函数指针指针函数在使用和定义上有明显的区别。函数指针是指向函数指针,而指针函数是一个返回类型为指针函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [c++ 指针函数函数指针](https://blog.csdn.net/weixin_40378209/article/details/123982447)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++笔记 指针函数函数指针详解](https://blog.csdn.net/weixin_40933653/article/details/124022898)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Love coldplay

你的鼓励,将让我持续更新

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值