在分享这些高级声明之前,我想,大家有必要知道各个操作符在C、C++语言中的优先级,以便识别欲讲述的高级声明。
这里先列举一些高级声明的例子,能自己揣摩清楚最好不过了,如果有想不懂的地方,请参见下方的识别方法。
复制内容到剪贴板
<code>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是一个元素为指针的数组,这些指针指向一个函数,函数接受两个参数,返回值类型为指向整型的指针</code>
【识别指针高级声明的方法】
明确各操作符的优先级,然后按优先级(若优先级相同则按结合性判断)顺序识别即可(若有括号,首先结合括号内的操作符),例如:
<code>例子① int *(*f)(); /*** * 步骤: * ①操作符有:解引用操作符 * 函数调用操作符 () * ②优先级顺序 () > * * ③解读int *(*f)(); * 由于括号的作用,f首先是一个指针,然后由于函数调用操作符优先于解引用操作符 * 因此f是一个指向函数的指针,最后该函数的返回类型为 int * * 最终结果: * f是一个指向返回类型为 int * 型函数的函数指针 ***********************************************************************/ 例子② int (*(*f)())[]; /*** * 步骤: * ①操作符有:解引用操作符 * 函数调用操作符 () 下标操作符 [] * ②优先级顺序 () == [] > * * ③解读int (*(*f)())[] * 由于括号的作用,f首先是一个指针,然后由于函数调用操作符优先于解引用操作符 * 因此f是一个指向函数的指针,由于外层括号的作用,得到最终结果 * f是一个函数指针 * 该指针指向一个函数 * 该函数的返回类型为一个指向整形数组的指针 *********************************************************************/ 例子③ int *(*(*(*f)())[])(); 相信大家根据以上两个例子能推出这个声明的含义了吧,其实就是一层一层的往外面走就是了 最终结果: 声明f是一函数指针,该函数返回一指针,该指针指向数组,数组元素是指针,这些元素指向返回值类型为整型指针的函数</code>
本文转自Bill_Hoo 51CTO博客,原文链接:http://blog.51cto.com/billhoo/642618,如需转载请自行联系原作者