指针函数和函数指针的总结:
一个函数会在内存中占用连续的一段内存空间
1. 函数指针
函数指针就是指向函数的一个指针,它指向函数的入口地址,通过这个指针就能调用这个函数,类似于给函数起别名。
定义(主要在main方法中进行定义):
类型 (*符号名)(参数类型列表)
可以先定义再初始化,也可以定义的时候直接初始化
//举例说明一哈
int max(int a,int b){
return a > b ? a : b;
}
int main(){
int a=5,b=7;
int (*fun)(int ,int )=max;
// int (*fun)(int x,int y)=max; 这种也可以定义
// int (*fun)=max; 这种见网上有人用,但是我编译不通过
cout<<max(a,b)<<" "<<fun(a,b)<<" "<<(*fun)(a,b)<<endl;
}
运行结果
可以看出,运行结果中三种方式得到的结果一样,在使用时(*fun)与fun效果一样,所以以后可以直接用fun
主要用途:通过函数指针,能够在函数里面更加方便的调用函数或者在数组里能够调用函数。
2. 指针函数
函数指针归根到底是一个指针,而指针函数本身就是一个函数,只不过要求它的返回值是指针类型。
定义(它是定义一个函数):
类型 *函数名(参数){
代码块;
(返回值必须为所指定的指针类型)
}
如 int *max(int a,int b); 这个函数的返回值必须是一个int*类型,如果直接返回a或者b会出现编译错误。
int *max(int a,int b){
if(a>b) return a;
else return b;
}
int main(){
int a=2,b=3;
cout<<"max = "<<*max(a,b)<<endl;
}
运行结果如下:
它告诉我们说:从“int”到“int*”的转换无效。
也就是说,我们的返回值不是函数规定的返回值类型,我们应该返回一个指针出来。
//第一种
int *max(int a,int b){
int *p=&a;
int *q=&b;
if(a>b) return p;
else return q;
}
//我们可以这样写,因为p,q本身是一个int的指针类型,可以直接返回,
//但是如果我们 return *p 就不对了,因为*p是取指针对应的值也就是a的值,是int类型。
//第二种
int *max(int a,int b){
if(a>b) return &;
else return &b;
}
//我们直接用& 取地址进行返回一个指针。
//第三种定义方式
int *max(int *_a,int *_b){
if(*a>*b) return a;
else return b;
}
//传值是就是一个指针,传出去时也是一个指针,
//if里面要使用*a来获取指针的值进行判断大小,要不然判断的就是两个地址的大小。
注意点:在使用时,要使用*函数名来调用。
int main(){
int a=2,b=3;
cout<<"max = "<<*max(a,b)<<endl;
cout<<"max = "<<max(a,b)<<endl; // 相差一个*号
}
运行结果:
能看出来上面是值,下面返回的是地址,所以我们调用时要带上*号。
函数指针有两个用途:调用函数和做函数的参数。