原创
在分享这些高级声明之前,我想,大家有必要知道各个操作符在C、C++语言中的优先级,以便识别欲讲述的高级声明。
这里先列举一些高级声明的例子,能自己揣摩清楚最好不过了,如果有想不懂的地方,请参见下方的识别方法。
复制内容到剪贴板
代码:
int f; //声明f为一整型变量
int *f; //声明f为一指向整型的指针
int *f,g; //声明f为指向整型的指针,g为整型变量
int f(); //声明f为返回值类型是int的函数
int *f(); //声明f为一函数,返回类型是指向整型的指针
int (*f)(); //声明f是指针,指向返回值为整型的函数
int *(*f)(); //声明f是指针,指向函数,函数返回类型是指向整型的指针
int *(*f)[]; //声明f是指针,它指向元素为×××指针的指针数组
int **f(); //声明f是一个函数,函数的返回值是一个指向整型指针的指针
int *(*f())(); //声明f是函数,函数返回类型是某种指针,该指针指向返回类型为整型指针的函数
int (**(*f)())(); //声明f是指针,它指向某个函数,该函数返回类型是指向另一返回值为整型的函数的指针的指针
int f[]; //声明f是数组,数组元素是整型
int *f[]; //声明f是数组,数组元素是指向整型的指针
int **f[]; //声明f是数组,元素是指向整型指针的指针
int (*f)[]; //声明f是指针,它指向一个整型数组
int f()[]; //非法声明,函数不能返回数组
int f[](); //非法声明,数组的元素不能是函数
int (*f[])(); //声明f是一个数组,数组元素是某种类型的指针,这些指针指向返回值为整型的函数,即f是一个元素为指向返回值是整型的函数的指针的数组
int *(*f[])(); //声明f是一个数组,数组元素为某种类型的指针,这些指针指向的是函数,这些函数返回值类型为指向整型的指针
int **(*f[6])(); //声明f是一个拥有6个元素的数组,它的元素是:某种类型的指针,这些指针指向的是函数,函数返回值是一个指向整型指针的指针
int (*(*f)())[]; //声明f是一个指针,指向函数,该函数返回值为指针,它指向一整型数组
int *(*(*(*f)())[])(); //声明f是一函数指针,该函数返回一指针,该指针指向数组,数组元素是指针,那些指针指向返回值类型为整型指针的函数
int (*f)(int,float); //声明f是一函数指针,它指向一个接受两个参数的函数,函数返回值类型是整型
int *(*g[])( int, float ); //声明g是一个元素为指针的数组,这些指针指向一个函数,函数接受两个参数,返回值类型为指向整型的指针
【识别指针高级声明的方法】
明确各操作符的优先级,然后按优先级(若优先级相同则按结合性判断)顺序识别即可(若有括号,首先结合括号内的操作符),例如:
复制内容到剪贴板
代码:
例子① int *(*f)();
* 步骤:
* ①操作符有:解引用操作符 * 函数调用操作符 ()
* ②优先级顺序 () > *
* ③解读int *(*f)();
* 由于括号的作用,f首先是一个指针,然后由于函数调用操作符优先于解引用操作符
* 因此f是一个指向函数的指针,最后该函数的返回类型为 int *
* 最终结果:
* f是一个指向返回类型为 int * 型函数的函数指针
***********************************************************************/
例子② int (*(*f)())[];
* 步骤:
* ①操作符有:解引用操作符 * 函数调用操作符 () 下标操作符 []
* ②优先级顺序 () == [] > *
* ③解读int (*(*f)())[]
* 由于括号的作用,f首先是一个指针,然后由于函数调用操作符优先于解引用操作符
* 因此f是一个指向函数的指针,由于外层括号的作用,得到最终结果
* f是一个函数指针
* 该指针指向一个函数
* 该函数的返回类型为一个指向×××数组的指针
*********************************************************************/
例子③ int *(*(*(*f)())[])();
相信大家根据以上两个例子能推出这个声明的含义了吧,其实就是一层一层的往外面走就是了
最终结果:
声明f是一函数指针,该函数返回一指针,该指针指向数组,数组元素是指针,这些元素指向返回值类型为整型指针的函数
©著作权归作者所有:来自51CTO博客作者Bill_Hoo的原创作品,如需转载,请注明出处,否则将追究法律责任