19人参与 • 2025-08-20 • C/C++
类比整型指针和数组指针的概念,我们可以得出:函数指针变量是用来存放函数地址的变量,通过这个地址我们可以调用相应的函数。
通过以下测试代码可以验证:
#include <stdio.h> void test() { printf("hehe\n"); } int main() { printf("test: %p\n", test); printf("&test: %p\n", &test); return 0; }
输出结果:
结果表明函数确实有地址,且函数名就是函数的地址,也可以通过&函数名
的方式获取函数地址。(重点!!!)
函数指针变量的声明语法与数组指针类似:
void test() { printf("hehe\n"); } // 两种等效的函数指针声明方式 void (*pf1)() = &test; void (*pf2)() = test; int add(int x, int y) { return x + y; } // 函数指针声明,参数名可省略 int (*pf3)(int, int) = add; int (*pf4)(int x, int y) = &add;
以int (*pf3)(int x, int y)
为例:int (*) (int x, int y) 为pf3函数指针变量的类型
通过函数指针调用函数的示例:
#include <stdio.h> int add(int x, int y) { return x + y; } int main() { int(*pf)(int, int) = add; // 两种等效的调用方式 printf("%d\n", (*pf)(2, 3)); // 显式解引用 printf("%d\n", pf(3, 5)); // 隐式调用 return 0; }
输出结果:
以下两段有趣的代码出自《c陷阱和缺陷》:
这段代码的功能是:调用位于内存地址0处的函数。
让我们逐步解析:
void (*)():
这是一个函数指针类型,表示"指向一个没有参数且返回void的函数的指针"。(void (*)())0:
将整数值0强制转换为上述函数指针类型。这表示"把地址0当作一个函数的地址"。*(void (*)())0:
解引用这个函数指针,得到位于地址0处的函数。(*(void (*)())0)():
最后调用这个函数(通过函数指针调用)。实际意义:这段代码尝试调用内存地址0处的函数。在嵌入式系统中,这可能是调用复位向量或启动代码的方式。但在大多数现代操作系统中,这会引发段错误(segmentation fault),因为地址0通常是被保护的区域。
这是一个函数声明,声明了名为signal
的函数。让我们分解它:
void(*)(int):
这是一个函数指针类型,表示"指向一个接受int参数且返回void的函数的指针"。signal(int, void(*)(int)):signal
是一个函数,它接受两个参数:一个int、一个上述类型的函数指针void (*signal(int, void(*)(int)))(int):
表示signal
函数返回一个函数指针,这个指针指向"接受int参数且返回void的函数"。更易读的写法(使用typedef,下面会讲解):
typedef void (*sighandler_t)(int); // 定义函数指针类型 sighandler_t signal(int signum, sighandler_t handler);
实际意义:这是unix/linux系统中用于设置信号处理器的标准函数声明。它:
typedef用于类型重命名,可以简化复杂类型的声明。
typedef unsigned int uint; // 将unsigned int重命名为uint typedef int* ptr_t; // 将int*重命名为ptr_t
新的类型名必须在*的右边:
typedef int(*parr_t)[5]; // 将数组指针类型int(*)[5]重命名为parr_t typedef void(*pfun_t)(int); // 将函数指针类型void(*)(int)重命名为pfun_t
typedef void(*pfun_t)(int); pfun_t signal(int, pfun_t);
数组是存放相同类型数据的存储空间。我们已经学过指针数组:
int *arr[10]; // 数组的每个元素是int*
如果要存储函数地址,就需要使用函数指针数组。函数指针数组的定义方式:
int (*parr1[3])(); // 正确:包含3个函数指针的数组,每个指针指向返回int的无参函数
下面是错误用法:
int *parr2[3](); // 错误:错误语法 int (*)() parr3[3]; // 错误:错误语法
解析parr1:
parr1
先与[]
结合,说明它是一个数组int (*)()
类型的函数指针函数指针数组常用于实现状态机或回调函数机制,是c语言中一种强大的编程技术。
到此这篇关于深入解析c++中函数指针及其数组、typedef关键字用法举例的文章就介绍到这了,更多相关c++函数指针 typedef关键字内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论