如何在 C 语言中定义指向函数的指针并将该指针分配给函数?

How do I define a pointer to a function in C and assign that pointer to a function?

提问人:Gromit 提问时间:10/31/2023 最后编辑:PM 77-1Gromit 更新时间:10/31/2023 访问量:54

问:

我正在尝试在 C 中定义指向函数的指针,然后将该指针分配给函数。我找到的所有示例都是针对带有参数和返回值的函数,但我的函数两者都没有。

我用编译器尝试的所有内容都会导致错误。MPLAB XC8'main.c:39:9: error: initializing 'void (*)()' with an expression of incompatible type 'void'''main.c:39:18: error: expression is not assignable'

scan_KP()是键盘扫描功能

这是我对指针的声明:

void (*KP_ScanPTR)(void);

现在,我想要scan_KP分配给指针的函数的地址;这是我尝试过的:

(*KP_ScanPTR)() = scan_KP();
void (*KP_ScanPTR)() = scan_KP();
void (*KP_ScanPTR)(void) = scan_KP();

这会导致“main.c:39:28:error: expected expression”,但我没想到它会起作用:

(*KP_ScanPTR)() = scan_KP(void);

我也试过这个。有趣的是,我得到:main.c:39:8:错误:使用不兼容类型“void”的表达式初始化“int(*)()”。所以我认为声明是正确的,因为它知道没有参数,也没有来自 scan_KP();

int (*KP_ScanPTR)() = scan_KP();

这是我用作参考的代码示例:

#include<stdio.h>
int subtraction (int a, int b) {
   return a-b;
}
int main() {
   int (*fp) (int, int)=subtraction;
   //Calling function using function pointer
   int result = fp(5, 4);
   printf(" Using function pointer we get the result: %d",result);
   return 0;
}

我还回顾了这个问题 一个函数的指针,这个 返回一个函数的指针 第二个显示了类似的语法

int funcA(int a, int b) { ... }
int (*funcB)(int, int) = funcA;

所以我删除了参数并返回,但它没有。

那么我在这里做错了什么?

C 函数 指针

评论

0赞 jarmod 10/31/2023
当你写的时候,你是在调用那个函数,而不是在获取它的地址。scan_KP()

答:

3赞 Thomas 10/31/2023 #1

中的括号会导致调用您的函数,而不是获取其地址。结果是一个表达式,其类型为 — 我不确定这算不算一个表达式,而且它绝对不是分配给函数指针的正确类型。scan_KP()void

只需省略括号,与您引用的两个示例一致:

void (*KP_ScanPTR)(void) = scan_KP;

您还可以添加 address-of 运算符:&

void (*KP_ScanPTR)(void) = &scan_KP;

对于编译器来说,这没有区别,但对于人类读者来说,它可以更清楚地知道函数的地址正在被获取。