函数指针的概念

关于函数指针

函数指针是指向函数的指针,是存放函数地址的指针。

1.首先看一段代码:

int Add(int x, int y)
{
	return x + y;
}
int main()
{
    //数组:
	int arr[10];
	int(*p) = &arr; //p是一个数组指针变量
	
	//函数:
	printf("%p\n", &Add);//打印函数的地址005C10B4
	printf("%p\n",  Add); //打印函数的地址005C10B4
	//以上两种写法的意义是一样的

	int(*pf)(int,int) = Add;//pf就是函数的指针变量
	//(*pf)表示一个指针,(*pf)指针指向的是一个函数,指向函数的参数是(int,int),(*pf)指向这个函数的返回类型是int,所以这里的pf就是函数的指针变量
	return 0;
}

2.练习将test函数地址存放入pt中,给pt匹配类型如下:

int test(char* str)
{

}
int main()
{
	int (*pt)(char) = test;
	return 0;
}

1.函数指针的用法

代码1:

int Add(int x, int y)
{
	return x + y;
}
int main()
{

	int(*pf)(int,int) = Add;//pf就是函数的指针变量
	//(*pf)解引用找到Add这个函数
	int ret = (*pf)(2, 3);//传参
	printf("%d\n ", ret); //打印结果是5
	return 0;
}

代码2:

int Add(int x, int y)
{
	return x + y;
}
int main()
{

	int(*pf)(int,int) = Add;//把Add赋给pf,pf就是函数的指针变量
	int ret = pf(2, 3);
	printf("%d\n ", ret);//打印结果是5
	return 0;
}

  通过对比代码1和代码2会发现:int ret = (*pf)(2, 3);与 int ret = pf(2, 3);打印出来的的结果是一样的,所以int ret = (*pf)(2, 3);中的 *好像没发挥什么作用,写不写都可以,但是通常情况下是要写上的,因为这样有利于阅读和理解。但是需要注意的是(*pf)的括号不能省略。

2.阅读两端代码:

代码1:

int main()
{
	(*(void (*)())0)();
	
	//void (*)() 是一个函数指针类型
	//void (*p)() 表示(*p)这个指针指向一个函数,这个函数无参,指针的返回类型是void
	//(void (*)()),将一个函数指针类型“void (*)()”放进括号,表示强制类型转换
	//注意:(类型),类型放进括号里就是强制类型转换

 	//(void (*)())0,表示对0进行强制类型的转换,把0强制类型转换成void (*)()这样的函数类型指针,那就认为0地址处放着返回类型为void参数为空的这样一个函数

	//总结:
	//1.首先是把0强制类型转换为一个函数指针类型,这就意味着0地址处放一个返回类型是void,无参的一个函数
	//2.调用0地址处的这个函数
	//
	return 0;
}

代码2:

int main()
{
	//代码2
	void (*signal(int, void(*)(int)))(int);//函数声明
	//signal首先和()结合,signal表示一个函数名,这个函数的第一个参数是int,第二个参数是void(*)(int)函数指针类型,void (*)(int)是函数的一个返回类型

	//总结:
	//1.signal是一个函数的声明
	//2.signal函数的参数,第一个是int类型的,第二个是void(*)(int)的函数指针类型
	//3.signal函数的返回类型也是:void(*)(int)


	//简化:
	typedef void(*pf_t)(int);//给函数指针类型void(*)(int)重新起名叫:pf_t
	pf_t signal(int, pf_t);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值