1. 关于地址
void func(int a, int b) {
printf("---------------------%d ------------ %d\n", a, b);
}
int main() {
// 相同的地址
printf("-------------------%d\n", func);
printf("-------------------%d\n", &func);
printf("-------------------%d\n", *func);
return 0;
}
2. 关于声明
void (*f)();
f = func;
f(10, 20);
3. 关于回调
int text(int a, int b, int (*callback)(int)) {
int result = a + b;
callback(result);
}
int call(int result) {
printf("----------------------%d\n", result);
}
text(10, 20, call);
3. 关于别名(宏定义)
typedef int FUNC(int, int);
void func(int a, int b) {
printf("---------------------%d ------------ %d\n", a, b);
}
FUNC *p = func;
p(15, 23);
(&func)(15, 25);
(*func)(52, 6021);
(*p)(62, 712);
4. 函数指针数组
typedef int FUNC(int, int) ;
int jia(int a, int b) {
return a + b;
}
int jian(int a, int b) {
return a - b;
}
int cheng(int a, int b) {
return a * b;
}
int chu(int a, int b) {
return a / b;
}
int main() {
// (int a, int b) 是函数 *p[4] 是指针数组 从后向前读就是:函数指针数组
int (*p[4]) (int a, int b) = {jia, jian, cheng, chu};
int a = 10;
int b = 5;
for (int i = 0; i < 4; ++i) {
printf("---------------%d\n", p[i](a, b));
}
return 0;
}
5. 值传递和地址传递的区别
int jia(int a, int b) {
return a + b;
}
int jian(int a, int b) {
return a - b;
}
void change(int (**p1) (int, int)) {
*p1 = jia;
}
int main() {
int (*p) (int, int) = jia;
printf("---------------%d\n", p(10, 30));
p = jian;
printf("---------------%d\n", p(10, 30));
change(&p);
printf("---------------%d\n", p(10, 30));
return 0;
}