指针定义: int *p; (int *)合为一体作为类型名,p是变量名,*除了在定义指针时,均作取值操作,取对应地址里存放的值。
指针赋值:
int c,d,*a=&c,*b=&d;
a=b;//把b中存的地址给a
指针常量与常量指针:
int * const p 这个指针是个常量(从左往右读就行,指针(int *)常量(const))
const int *p 这个指针指向常量(从左往右读就行)
函数名就是一种函数指针常量,不可以被赋值,同理还有数组名。 定义的函数指针是函数指针变量,他可以任意赋值指向任何同类型函数(返回值和参数类型一样)。所以从根本出发,还存在这样一种函数调用方式
void MyFun(int x) //这里定义一个MyFun函数
{
printf(“%d\n”,x);
}
int main()
{
(*Myfun)(10);
}
但是为了方便,C语言规则允许 Myfun(10)这种写法,在此之上为保持同一,函数指针也被允许这样的调用方式
void (*pfunc)(int)
void MyFun(int x) //这里定义一个MyFun函数
{
printf(“%d\n”,x);
}int main()
{
pfunc=Myfun;
pfunc(10);
}
同理也可以(*pfunc)(10);这样调用,
总结一下,就是说调用时*可加可不加。
赋值时,既可以FunP=&MyFun形式,也可FunP=MyFun
但是在定义时需注意,*加不加要按规范写法
void MyFun(int ); //不能写成void (*MyFun)(int )。
void (*FunP)(int ); //不能写成void FunP(int )。
另外关于函数声明和函数指针声明的在形式上
void MyFun(int x); //这个申明也可写成:void MyFun( int );
void (*FunP)(int ); //也可申明成void(*FunP)(int x),但习惯上一般不这样。
函数或函数指针都能作为函数参数
void show(FUNC2 *fun,int arg1, int*arg2)
//void show(FUNC2 fun,int arg1, int*arg2)//这里做这样的声明也一样是对的
这两种声明方式都是对的,
作者的观点是void show(FUNC2 fun,int arg1, int*arg2)使用一个函数做为形式参数,调用时传递一个函数名字给他就可以,也可以传递一个函数常量指针。类比于使用指针常量或者数组作函数书参数的时候。