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

标签 c function pointers

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

我在 MPLAB XC8 编译器上尝试过的所有操作都会导致 'main.c:39:9: error:initializing 'void (*)()' with an expression of in兼容类型'void'''main.c:39:18: error: 表达式不可分配' 错误。

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:错误:预期表达式”,但我没想到它会起作用:

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

这个我也试过了。有趣的是,我得到: main.c:39:8: error:用不兼容类型“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;
}

我也审阅了这个问题A pointer to a function还有这个Returning a pointer to a function第二个显示类似的语法

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

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

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

最佳答案

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

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

void (*KP_ScanPTR)(void) = scan_KP;

您还可以添加地址运算符&:

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

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

关于c - 如何在 C 中定义指向函数的指针并将该指针分配给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77397385/

相关文章:

c++ - 访问指针句柄中对象的地址

c - printf函数会影响变量的生命周期吗?

c++ - 为什么我的指针不是结构或 union ?

c - unix select() 调用 : how to combine fd_sets?

c - 请帮助我了解 "strcmp"

javascript - 如何处理在 javascript 中第一次调用终止之前调用次数过多的函数

c - Vim + omnicppcomplete 枚举补全

C++ 第一次使用函数

python - 在 Python 中的文件末尾声明函数

c++ - 如何为比对象所有者生存时间短的类组织对象所有权?