函数指针:指向函数的指针,“数据类型”(*fun)(参数列表)“ void*(*fun)(int*,int*)
int (*p)(char) p被声明为一个函数指针,这个函数带一个char类型的参数,并且有一个int 类型的返回值
char ** (*p)(float,float); 带两个float类型参数、返回值是char 类型的指针的指针函数
void * (*a[5]) (char * const ,char * const) 带两个char类型的const指针函数、无返回值的函数指针
指针函数:返回值是函数的指针,”数据类型“ *fun(参数列表) char* fun(int*,int*)
步骤:
一:第一函数指针:int (*pfun)(int*,int*):
二:定义函数:int fun(int*,int*);
三:把函数的地址赋给函数指针:pfun=fun
四:通过函数指针去调用这个函数"(*pfun)(p,q);",pfun是函数地址,*pfun函数本身。
const 阻止变量被改变
int * const r=&n; int类型const指针
const int *p; int const *q; const int类型指针
const int * const p=&n; const int类型const指针
typedef
typedef工具是一个高级数据特性,利用typedef可以为某一类型自定义名称
右左法则
从最内部的括号开始阅读声明,向右看,然后想左看。当你碰到一个括号是就调转阅读的反向。括号内的所有内容都分析完毕就跳出括号的范围。这样继续,直到整个声明都分析完毕。
当第一次开始阅读声明时,必须从变量名开始而不是从最内部括号。
int * (*(*fp1) (int) ) [10];
从变量名开始——fp1;
往右看,什么也没有,碰到了),因此向左看,碰到一个*——一个指针。
跳出括号,碰到一个(int)——一个带一个int 参数的函数。
向左看,发现一个*——(函数)返回一个指针。
跳出括号,向右看,碰到【10】 ——一个10元素的数组。
向左看,发现一个*——指针。
向左看,发现int——int类型。
fp1 被声明成为一个函数指针,该函数返回指向指针数组的操作。