1. 函数指针
函数指针 的本质是一个指针,该指针的地址指向了一个函数,所以它是指向函数的指针
#include<stdio.h>
int max(int a,int b){
if(a>b){
return a;
}
return b;
}
int min(int a,int b){
if(a>b){
return b;
}
return a;
}
int add(int a,int b){
a = a+b;
return a;
}
int main(){
int a=2,b=4;
// int (*p)(int ,int);
int (*p)(int a, int b); //也可以使用这种方式定义函数指针
p = max;
int ret = p(a, b);
// int ret = (*max)(a, b);
// int ret = (*p)(a, b);
printf("max_ret = %d\n",ret);
p = min;
ret = p(a, b);
printf("min_ret = %d\n",ret);
p = add;
ret = p(a, b);
printf("add_ret = %d\n",ret);
return 0;
}
函数指针变量常用的用途之一是把指针作为参数传递到其他函数(回调函数)
2. 回调函数
回调函数是一个通过指针函数调用的函数。其将函数指针作为一个参数,传递给另一个函数。
回调函数并不是由实现方直接调用,而是在特定的事件或条件发生时由另外一方来调用的。
最主要的用途就是当函数不处在同一个文件中,比如动态库,要调用其他程序中的函数就只有采用回调的形式
#include<stdio.h>
int max(int a,int b){
if(a>b){
return a;
}
return b;
}
int min(int a,int b){
if(a>b){
return b;
}
return a;
}
int add(int a,int b){
a = a+b;
return a;
}
void callback(int a,int b,int (*fun)(int ,int)){
printf("%d\n",fun(a,b));
}
int main(){
int a=2,b=5;
callback(a,b,max);
callback(a,b,min);
callback(a,b,add);
return 0;
}
3. 指针函数
ret *func(args, ...);
f u n c func func是一个函数, a r g s args args是形参列表, r e t ∗ ret * ret∗作为一个整体,是 f u n c func func函数的返回值,是一个指针的形式。
#include<stdio.h>
int * add(int a,int b){
int *p = &a,*q = &b;
static int c = 0;
int *s = &c;
c = *p+*q;
return s;
}
int main(){
int a =2,b = 3;
int *p;
p = add(a,b);
printf("1111111\n");//加句话*p输出会变,局部变量是存放于栈区的,当函数结束,栈区的变量就会释放掉
printf("*p = %d\n",*p);
return 0;
}
注:
- 局部变量是存放于栈区的,当函数结束,栈区的变量就会释放掉
- 使用指针函数的时候,一定要避免出现返回局部变量指针的情况
- 使用 s t a t i c static static去修饰变量,该变量就变成了静态变量。静态变量是存放在数据段的,它的生命周期存在于整个程序运行期间、