【C语言 | 指针】函数指针详解

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍C语言函数指针🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭

本文未经允许,不得转发!!!


在这里插入图片描述

🎄一、函数指针的定义

函数指针就是函数的指针。它是一个指针,指向一个函数。

✨1.1 直接定义函数指针变量

直接定义函数指针变量就是将函数声明中的函数名换成(*pFun),pFun是函数指针名称。

看例子:

void *fun(const char *str, int strLen); //函数声明
               |
               V
void *(*pFun)(const char *str, int strLen); //函数指针定义

✨1.2 使用typedef定义的类型来定义函数指针变量

这个方法分为两步:

  • 1、使用typedef重命名函数指针类型;
  • 2、定义函数指针变量。

看例子:

void *fun(const char *str, int strLen); //函数声明
               |
               V
typedef void *(*FunPointType)(const char *str, int strLen); //重命名一个函数指针类型
               |
               V
FunPointType pFun; //定义函数指针变量

在这里插入图片描述

🎄二、函数指针的使用

在C语言中,函数通常存放在代码区(也称为文本段)。代码区是程序内存布局中的一个部分,它通常用于存储可执行程序的指令。这包括函数的机器码以及其他执行代码。

当程序被加载到内存中并执行时,函数的机器码被加载到代码区,并由处理器执行。代码区通常具有只读权限,以防止程序意外修改程序指令,从而确保程序的完整性和安全性。

✨2.1 给函数指针变量赋值

给函数指针赋值时,可以用 &fun 或直接用函数名 fun,因为函数名被编译之后其实就是一个地址,所以这里两种用法没有本质的差别。

char * (*pf)(char * p1,char * p2);
char * (*pf2)(char * p1,char * p2);
pf = &fun;	// 取函数地址
pf2 = fun;	// 直接使用函数名

✨2.2 使用函数指针变量

使用函数指针变量时,可以使用取引用符合的格式(*pf) ("aa","bb");调用函数,也可以直接使用指针pf2("aa","bb");的形式去调用。

看例子:

// fun_point.c
#include <stdio.h>
#include <string.h>
char * fun(char * p1,char * p2)
{
	printf("[%s:%d]p1=%s p2=%s\n",__FUNCTION__,__LINE__,p1,p2);
	return p1;
}
int main()
{
	char * (*pf)(char * p1,char * p2);
	pf = &fun;
	(*pf) ("aa","bb");
	
	char * (*pf2)(char * p1,char * p2);
	pf2 = fun;
	pf2("aa","bb");
	return 0;
}

在这里插入图片描述

🎄三、函数指针数组

函数指针数组是一个数组,数组内的每个元素都是函数指针。

函数指针数组的定义:将函数声明中的函数名换成(*pF[3]),pF是函数指针数组名,[3]表示它是一个数组,有3个数组元素,可以根据需要换成其他数组大小。

void *fun(const char *str, int strLen); //函数声明
               |
               V
void *(*pFun)(const char *str, int strLen); //函数指针定义

看例子:

#include <stdio.h>
#include <string.h>
char * fun1(char * p)
{
	printf("%s\n",p);
	return p;
}
char * fun2(char * p)
{
	printf("%s\n",p);
	return p;
}
char * fun3(char * p)
{
	printf("%s\n",p);
	return p;
}
int main()
{
	char * (*pf[3])(char * p);
	pf[0] = fun1; // 可以直接用函数名
	pf[1] = &fun2; // 可以用函数名加上取地址符
	pf[2] = &fun3;
	pf[0]("fun1");
	pf[0]("fun2");
	pf[0]("fun3");
	return 0;
}

在这里插入图片描述

🎄四、函数指针数组的指针

函数指针数组的指针,本质上是指针,指向一个数组,数组元素都是函数指针。

函数指针数组的定义:将函数声明中的函数名换成(*(*pF)[3]),pF是函数指针数组指针名称,先与括号内的*结合,表示一个指针;然后与[3]结合,表示指向一个有3个数组元素的数组;再和左边的*结合,表示数组的元素都是指针。

void *fun(const char *str, int strLen); //函数声明
               |
               V
void *(*(*pF)[3])(const char *str, int strLen); //函数指针定义

看例子:

#include <stdio.h>
#include <string.h>
char * fun1(char * p)
{
	printf("%s\n",p);
	return p;
}
char * fun2(char * p)
{
	printf("%s\n",p);
	return p;
}
char * fun3(char * p)
{
	printf("%s\n",p);
	return p;
}
int main()
{
	char * (*a[3])(char * p);
	char * (*(*pf)[3])(char * p);
	pf = &a;
	a[0] = fun1;
	a[1] = &fun2;
	a[2] = &fun3;
	pf[0][0]("fun1");
	pf[0][1]("fun2");
	pf[0][2]("fun3");
	return 0;
}

在这里插入图片描述

🎄五、总结

👉本文介绍C语言的函数指针,函数指针的定义、函数指针的使用、函数指针数组、函数指针数组的指针。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

参考资料:
《C语言深度剖析》

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wkd_007

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值