函数指针/指针函数 的重点就在后面的两个字,例如,函数指针的重点就是 指针,它是一个指针。指针函数的重点就是函数,它是一个函数。
数组指针和指针数组同理
总结一点就是,重点在于后面的两个字,后面的两个字决定了它是什么。
指针函数
本质是一个函数,函数返回类型是某一类型的指针。
标识符 *函数名(参数表)
如 int * func(int a );
int *p = func();
函数指针
形式1:返回类型(*函数名)(参数表) 重点在与()
函数指针的声明方法为:
返回值类型 ( * 指针变量名) ([形参列表]);
注1:“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:
int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址(即函数地址)赋给指针f */
或者使用下面的方法将函数地址赋给函数指针:
f = &func;
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
函数地址就是函数名(后面不带参数),如果带参数就是函数返回值了 int func(int a ); func就是函数地址,可以把函数地址做为函数的参数进行传递。
注2:函数括号中的形参可有可无,视情况而定。
float functionadd(int a, float b);
float functionadd(int a, float b)
{
return a + b;
}
float(*pfuna)(int, float) ;
pfuna = functionadd;
或者
float(*pfuna)(int, float) = functionadd;
pfuna(1,1.3);
形式2:typedef
typedef 返回类型(*函数指针类型名称)(参数列表)
进一步使用typedef进行简化 ,用在给函数定义别名, 别名就是函数指针类型名称。
float functionadd(int a, float b);
float functionadd(int a, float b)
{
return a + b;
}
typedef float (*pfuna)(int, float); //别名
pfuna fa = functionadd;//赋值
fa(1, 1.3);//应用
形式3.使用using 的方式替换typedef
参考:c++11中using的使用_小飞侠hello的博客-CSDN博客_c++ using 函数指针
float functionadd(int a, float b);
float functionadd(int a, float b)
{
return a + b;
}
using pfuna = float(*)(int, float);
pfuna fa = functionadd;
fa(1, 1.3);
形式4. auto. 直接粗暴 auto
float functionadd(int a, float b);
float functionadd(int a, float b)
{
return a + b;
}
auto fa = functionadd;
fa(1, 1.3);
使用函数指针
1.调用函数 :有两种方式
a. 函数指针名称 (实参列表) int b = pf(1);
b.(*函数指针名称)(实参列表)int b = *pf(1);
2.作为参数传递