【C语言进阶:指针的进阶】函数指针

本文详细探讨了C语言中的函数指针,解释了如何存储和调用函数地址,以及函数指针在数组和传参中的应用。通过示例代码,阐述了函数指针变量的声明和使用,并解析了两个有趣的代码片段,展示了类型转换和函数指针在复杂声明中的作用。此外,还介绍了typedef在简化类型声明中的用法。
摘要由CSDN通过智能技术生成

本章重点内容:

  • 字符指针
  • 指针数组
  • 数组指针
  • 数组传参和指针传参
  • 函数指针
  • 函数指针数组
  • 指向函数指针数组的指针
  • 回调函数
  • 指针和数组面试题的解析

⚡函数指针

函数指针:指向函数的指针。 通过之前的学习我们知道数组指针中存放的是数组的地址,那么函数指针存放的是函数的地址吗?这里的答案是肯定的,代码示例如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void test()
{
	printf("hello world\n");
}
int main()
{
	printf("%p\n", test);
	printf("%p\n", &test);
	return 0;
}

代码运行结果如下:

 我们可以观察到,函数指针确实可以得到函数的地址。C语言中 函数名和&函数名 都是函数地址。接下来,我将为大家说明函数地址怎样存起来,代码示例如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int(*pf)(int, int) = Add; //函数的地址要存起来,就得放在【函数指针变量】中去
    int ret = (*pf)(3,5); //使用指针进行函数调用
    //int ret = pf(3,5);
    //int ret = Add(3,5);
    //这三种写法都可以成功调用Add函数,其中第一种的*是一个摆设,写与不写都可以,写上是为了理解方便
    printf("%d\n",ret);
	return 0;
}

 函数指针的写法说明示例:

下面来阅读两段有趣的代码:

//代码1
(*(void (*)())0)();

想要真正阅读这个代码的意思,分为以下几步:

  1. 将0强制类型转化为void(*)()类型的函数指针
  2. 这就意味着0地址处放着一个函数,函数没有参数,返回类型是void。
  3. 调用0地址处的这个函数。
//代码2
void (*signal(int , void(*)(int)))(int);

代码二的括号内部是一个函数的声明,函数名字是signal,signal函数的第一个参数是 int 类型,第二个是 void(*)(int) 类型的函数指针,该函数指针指向的函数参数是 int ,函数返回类型为 void,signal 函数的返回类型也是一个函数指针。该函数指向的函数参数是 int ,返回类型为 void 。

这里给大家补充一个简化代码2的方法,代码示例如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

typedef int* ptr_t;    //将 int* 重新命名为 ptr_t
typedef void(*pf_t)(int); //意思是将 void(*)(int) 重新命名为 pf_t,pf_t是类型

int main()
{
	void(* signal( int, void(*)(int) ) )(int);
	//化简后
	pf_t signal(int, pf_t);
	return 0;
}

这里要注意区分:typedef void(*pf_t)(int)中的 pf_t 是类型名;不写 typedef 时,void(*pf)(int) 中的pf是指针变量的名字。


感谢大家能够看完这篇博客,创作时长,小伙伴们觉得我的博客对你有帮助,不妨留下你的点赞的收藏,关注我,带你了解不一样的C语言。

98b76a6f4a9c4ca88fd93da1188ac6f9.gif

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值