备忘
- c语言的函数不是“一等公民”,它不算一种变量类型,不能像变量一样初始化、赋值。只能进行定义、声明、调用。
#include <stdio.h>
int main() {
void (func)(int); // declaration
// void (func2)(int) = func; // error: illegal initializer (only variables can be initialized)
func(1); // success calling 1
}
// definition
void func(int a) {
printf("success calling %d\n", a);
}
- c 语言提供了函数指针来完成类似于变量的操作。
函数指针是一种变量,可以正常地进行声明、定义、初始化、赋值、传参等操作。它与其它变量的不同之处在于它是 callable 的.
#include <stdio.h>
void func(int a) {
printf("success calling %d\n", a);
}
int main() {
void (*fp1)(int) = nullptr;
// fp1(1); // interrupted by signal 11: SIGSEGV
fp1 = &func;
fp1(2); // success calling 2
// long long i = 1;
// i(); // error: called object type 'int' is not a function or function pointer
// ((void (*)())i)(); // interrupted by signal 11: SIGSEGV
}
- 虽然类型不同,但调用函数与调用函数指针是等价的,也可以直接将函数赋值给函数指针。
#include <stdio.h>
void func(int a) {
printf("success calling %d\n", a);
}
int main() {
func(1);
void (*fp1)(int) = nullptr;
fp1 = &func;
(*fp1)(2);
fp1(3);
fp1 = func;
(*fp1)(4);
fp1(5);
fp1 = *fp1;
(*fp1)(6);
fp1(7);
(&func)(8);
printf("%s\n", typeid(func).name()); // FviE
printf("%s\n", typeid(fp1).name()); // PFviE
printf("%s\n", typeid(*fp1).name()); // FviE
}