😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍C语言函数指针🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭
本文未经允许,不得转发!!!
函数指针就是函数的指针。它是一个指针,指向一个函数。
直接定义函数指针变量就是将函数声明中的函数名换成(*pFun)
,pFun是函数指针名称。
看例子:
void *fun(const char *str, int strLen); //函数声明
|
V
void *(*pFun)(const char *str, int strLen); //函数指针定义
这个方法分为两步:
看例子:
void *fun(const char *str, int strLen); //函数声明
|
V
typedef void *(*FunPointType)(const char *str, int strLen); //重命名一个函数指针类型
|
V
FunPointType pFun; //定义函数指针变量
在C语言中,函数通常存放在代码区(也称为文本段)。代码区是程序内存布局中的一个部分,它通常用于存储可执行程序的指令。这包括函数的机器码以及其他执行代码。
当程序被加载到内存中并执行时,函数的机器码被加载到代码区,并由处理器执行。代码区通常具有只读权限,以防止程序意外修改程序指令,从而确保程序的完整性和安全性。
给函数指针赋值时,可以用 &fun
或直接用函数名 fun
,因为函数名被编译之后其实就是一个地址,所以这里两种用法没有本质的差别。
char * (*pf)(char * p1,char * p2);
char * (*pf2)(char * p1,char * p2);
pf = &fun; // 取函数地址
pf2 = fun; // 直接使用函数名
使用函数指针变量时,可以使用取引用符合的格式(*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语言深度剖析》