什么是函数指针?(理解及使用)

思维导图

在这里插入图片描述

1. 定义:

	char* fun1(char* p1, char* p2)// 1
	char** fun2(char* p1, char* p2);// 2
	char*(*fun3)(char* p1, char* p2);// 3

1,2,3分别是什么意思呢?

    1. 很简单,char*是返回类型,fun1是函数名,括号内是参数
    1. 和1相似,char** 是返回类型
    1. 就是我们要讲的函数指针,看下面的例子:
	int (*) [10]p//数组指针

是不是和数组指针特别的相似?这里的fun3不是函数名,是指针变量,它指向一个函数。
函数指针的定义就是,一个指向函数的指针

2. 例子

我们上面定义了一个函数指针,那我们该如何使用它呢?

int Add(int a, int b)
{
	return a + b;
}

int main()
{
	int(*fun1)(int a, int b);
	fun1 = &Add;
	cout << (*fun1)(1, 2) << endl;//使用函数指针
	cout << fun1(1, 2) << endl;//可以直接使用fun1

	system("pause");
	return 0;

}

我们在使用指针的时候,需要通过钥匙“ * ”来取其指向的内存的值,函数指针使用也如此。通过用(*fun1)取出该地址的函数然后调用他。也可以直接使用fun1,因为函数名被编译后其实就是一个地址。

3.(* (void(*))()0)()

让我们来看看 《C的陷阱与缺陷》中的经典例题

  • 1.void(*),可以明白这是一个函数指针类型。这个函数没有参数,没有返回型
  • 2.(void(*)())0,这是将0强制类型转换为函数指针类型,0是一个地址,也就是说函数存在首地址为0的一段区域内。
  • 3.(* (void(*)())0)这里是取0地址开始的一段内存的内容,其内容就是保存在首地址为0的一段区域的函数
  • 4.(* ( void(*))()0)() 这里是函数调用

4.函数指针数组

	char* (*fun[3])(char* p);//函数指针数组

它是一个数组,数组名是fun,数组内存了3个指向函数的指针。这些指针指向的一些返回值类型为指向字符的指针,参数为一个指向字符指针的函数。

5.函数指针数组的指针

我一开始看到这东西我脑子里都是???,然后查了些博客啥的就弄清楚了。我们都知道什么事数组指针,套用数组指针的理解来理解函数指针数组不就好了吗?

char* (*(*fun)[3]))(char* p);
  • 1.(*fun),是一个指针。
  • 2.(*fun)[3],表示这个指针指向一个包含三个元素的数组
  • 3.去掉(* fun)[3],看上面的例子,char* (* )(char* p),可以知道数组中的三个元素是返回类型为char*型的,参数为指向字符串的函数。
  • 39
    点赞
  • 154
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值