📅  最后修改于: 2023-12-03 14:40:25.786000             🧑  作者: Mango
在C和C++中,函数也是一种数据类型。每个函数在内存中都有一个地址,就像变量一样。这使得我们可以像处理变量一样处理函数。
要获取函数的地址,只需在函数名前加上取地址运算符&
。例如:
#include <stdio.h>
void foo() {
printf("Hello world!");
}
int main() {
void (*ptr)() = &foo; // 获取foo函数的地址
(*ptr)(); // 使用指针调用foo函数
return 0;
}
我们定义了一个指向函数的指针ptr
,将它指向foo
函数的地址。然后通过指针调用这个函数。
有了函数的地址,我们可以把它传递给其他函数或存储它以备将来使用。
#include <stdio.h>
void foo() {
printf("Hello world!");
}
void bar(void (*f)()) {
f(); // 调用f指向的函数
}
int main() {
void (*ptr)() = &foo;
bar(ptr); // 传递函数指针给bar函数
return 0;
}
我们定义了bar
函数,接收一个指向函数的指针,然后调用该指针指向的函数。在main
函数中,我们创建一个指向foo
函数的指针,将它作为参数传递给bar
函数。
由于函数指针的类型定义往往会非常复杂,为此,C/C++提供了typedef语句,方便声明复杂的函数指针类型。例如:
#include <stdio.h>
// 声明函数指针类型
typedef void (*func_ptr)();
void foo() {
printf("Hello world!");
}
void bar(func_ptr f) {
f();
}
int main() {
func_ptr ptr = &foo;
bar(ptr);
return 0;
}
在声明函数指针类型时,我们使用typedef定义了一个新类型func_ptr
,表示指向无返回值函数的指针类型。接着,我们使用这个类型作为bar函数的参数类型,使得bar函数更加可读且易于维护。