两种定义函数指针的方法和区别
例如
typedef void (*iapfun)(void);定义之后是作为一个指针类型
typedef void (*iapfun)(void)定义了一个函数指针类型iapfun,该函数没有参数并且没有返回值。您可以使用此类型定义指向此类型的函数指针,并将其用作函数参数或变量。
typedef void (*iapfun)(void); void my_function(iapfun func_ptr) { // Call function pointed to by func_ptr (*func_ptr)(); } void my_other_function(void) { // Do something } int main(void) { // Define function pointer variable iapfun ptr; // Assign address of my_other_function to ptr ptr = &my_other_function; // Call my_function with ptr as argument my_function(ptr); return 0; } 在此示例中,my_function是一个函数,它接受一个指向iapfun类型的函数指针作为参数,并调用该指针指向的函数。
my_other_function是一个没有参数和返回值的函数,它可以被指向iapfun类型的函数指针调用。
在main函数中,定义了一个指向iapfun类型的函数指针变量ptr,并将其赋值为my_other_function的地址。
然后,调用my_function函数,并将ptr作为参数传递。my_function将调用my_other_function函数,并执行其中的代码
另一种
#include <stdio.h> int add(int a, int b) { return a + b; } typedef void (*iapfun)(void); void foo() { printf("Hello, world!\n"); } int main() { int (*ptr)(int, int); ptr = &add; int result = (*ptr)(2, 3); printf("%d\n", result); iapfun ptr2 = &foo; (*ptr2)(); return 0; }
函数指针是一种类型,它是一个指向函数的指针,可以用于间接调用函数。函数指针的类型由它所指向的函数的返回类型和参数类型决定。
而typedef void (*iapfun)(void);是一种函数指针类型的定义方式,它定义了一个名为iapfun的函数指针类型,该函数指针指向一个没有参数和返回值的函数。
这种定义方式可以使代码更加简洁易读,同时也可以提高代码的可维护性
。因此,int (*ptr)(int, int)和typedef void (*iapfun)(void)之间的区别在于它们所定义的函数指针类型所指向的函数的返回类型和参数类型不同。
int (*ptr)(int, int)定义的函数指针类型指向一个返回整数类型并且有两个整数参数的函数,而typedef void (*iapfun)(void)定义的函数指针类型指向一个没有参数和返回值的函数。
ptr是一个指向add函数的函数指针,ptr2是一个指向foo函数的函数指针。我们可以使用ptr和ptr2间接调用add和foo函数,方法是用*对其进行解引用,并在括号中传递参数 。
指针函数和函数指针
int(*ptr)(int,int)函数指针是一个存储函数地址的变量。它可以用于间接调用函数。注意函数指针是个变量
int* create_array(int size) {
int* arr = malloc(size * sizeof(int));
return arr;
} 指针函数是一个返回指针的函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!