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

2023-12-20 16:42:23

😁博客主页😁:🚀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语言深度剖析》

文章来源:https://blog.csdn.net/wkd_007/article/details/135074008
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。