入门阶段,看见类似void * (*(*fp1)(int))[10];的复杂声明,晕乎。直接略过,这种复杂的东东,不应该是入门者需要去学习的知识。
进阶阶段,这种知识就必需得搞得清清楚楚了,不然还等到高阶阶段才学习这个么?
现在,就来带大家了解一下,这类复杂的声明怎么解?
在解之前,先看一个入门的知识点,指针函数作为参数传递。
int func_call(string text) { cout << text << endl; return 5; } void func_pointer(int (*fp)(string)) { cout << fp("func_pointer") << endl; } void main() { int (*fp)(string);//声明函数指针,此函数接受一个字符串参数并返回一个整型 fp = func_call; func_pointer(fp);//将函数指针作为参数传递 }
1. void * (*(*fp1)(int))[10];
2. float (*(*fp2)(int,int,float))(int);
解1:void * (*(*fp1)(int))[10];
(1)包含fp1的最内层小括号是(*fp1):fp1是指针
解2:float (*(*fp2)(int,int,float))(int);
(1)包含fp2的最内层小括号是(*fp2):fp2是指针
(2)往(*fp2)右边看是(int,int,float),右边是小括号即是函数:指向带有3个参数的函数
(3)再往(*fp2)左边看是*,当右边是函数,左边即是函数的返回值:且函数返回一个指针
(4)往(*(*fp2)(int,int,float))右边看是(int),右边小括号表示函数:指针指向带1个整型参数的函数
(5)再往(*(*fp2)(int,int,float))左边看是float,即是函数的返回值:函数返回float
把整段话拼出来:
fp2是指针,指向带有3个参数的函数,且函数返回一个指针,指针指向带1个整型参数的函数,函数返回float
任何复杂的声明都按此方法解,中间的变量名开始,右--左--右--左。编译器也是按此步骤读声明的。
下面代码示例:
typedef void* (*AP)[10]; AP func_fp1(int i) { cout<< "func_fp1:" << i << endl; AP a = nullptr; return a; } void main() { void * (*(*fp1)(int))[10]; fp1 = func_fp1; (*fp1)(5); }
void main() { AP (*fp1)(int); fp1 = func_fp1; (*fp1)(5); }
float func_f(int i) { cout<< "func_f:" << i << endl; return 1.0f; } typedef float (*FP)(int); FP func_fp2(int i,int j,float f) { cout<< "func_fp2 i:" << i << ", j:" << j << ", f:" << f << endl; //float (*fp)(int); FP fp; fp = func_f; return fp; } void main() { float (*(*fp2)(int,int,float))(int); fp2 = func_fp2; (*(*fp2)(1,2,3))(4); }
void main() { FP (*fp3)(int,int,float); fp3 = func_fp2; (*(*fp3)(5,6,7))(8); }