函数指针

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数指针相关的知识,希望对你有一定的参考价值。

先上一段代码:

#include<stdio.h>
typedef int (*FUNADD)(const int value1,const int value2);
FUNADD func;
int (*subFun)(const int value1,const int value2);
int sub(const int value1,const int value2)
{
	return value1-value2;
}
int add(const int value1 ,const int value2)
{
	return value1+value2;
}
int main()
{
	func = add;
	printf("func=%p *func=%p &func=%p\n",func,*func,&func);
	printf("add = %d\n",(*func)(1,2));
	subFun = sub;
	printf("subFun=%p *subFun=%p &subFun = %p\n",subFun,*subFun,&subFun);
	printf("sub = %d\n",subFun(2,1));
	printf("sub=%p *sub =%p &sub =%p\n",sub ,*sub ,&sub );
	return 0;
}

结果:

技术分享图片

经过一段时间的工作,到处都在用函数指针;闲的时候总结下。

一、函数指针

int (*subFun)(const int value1,const int value2);

1、这个东西一看就是指针对吧,因为带了括号,所以肯定不是返回值为指针的函数了;那他就是函数指针了,不知道你明白了吗。(因为*是和函数先结合的)

2、因为是指针,所以具有指针的特性;sunFun = sub肯定是成立的,有人会说sub不是函数名吗?那我们来看看,sub,*sub,&sub的值是一样的(比较特殊)。再来看看subFun,*subFun,&subFun,前面两个地址相同,后面一个不同,这个也好理解(因为sunFun是指针,指针的地址肯定和函数的地址不同)。

*sub是函数名也可以当指针用,sub的值是函数地址,&sub也是函数的地址;就像(数组,a,和&a[0]的地址一样,意义不一样)。所以subFun和*subFun和sub的值一样。

二、typedef函数指针

typedef int (*FUNADD)(const int value1,const int value2);
FUNADD func;

1、typedef就是重新定义了一个别名,typedef函数指针,当然是重新定义了别名,就能用他来定义。

2、FUNADD当然就是一个函数指针了,用它来定义的func就是拥有此功能的函数指针。

不知道我说清楚了,语言组织能力一直是个bug。




以上是关于函数指针的主要内容,如果未能解决你的问题,请参考以下文章

使用 std::thread 函数 C++11 将指针作为参数传递

片段中的 EditText 上的空指针异常 [重复]

如何在汇编函数中将元素数组作为参数传递时转发ARM寄存器的地址指针

片段中的空指针异常

活动到片段通信:当我尝试从活动更新片段中的文本视图时,出现空指针异常

使用回收器适配器获取空指针