天天看点

【指针的高级声明】

   在分享这些高级声明之前,我想,大家有必要知道各个操作符在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)();   /***   *   步骤:   *     ①操作符有:解引用操作符 *     函数调用操作符 ()     *     ②优先级顺序 () &gt; *   *     ③解读int *(*f)();   *       由于括号的作用,f首先是一个指针,然后由于函数调用操作符优先于解引用操作符   *       因此f是一个指向函数的指针,最后该函数的返回类型为 int *    *       最终结果:   *            f是一个指向返回类型为 int * 型函数的函数指针   ***********************************************************************/       例子②  int (*(*f)())[];     /***   *   步骤:   *     ①操作符有:解引用操作符 *     函数调用操作符 ()     下标操作符 []   *     ②优先级顺序 () == [] &gt; *   *     ③解读int (*(*f)())[]   *       由于括号的作用,f首先是一个指针,然后由于函数调用操作符优先于解引用操作符   *       因此f是一个指向函数的指针,由于外层括号的作用,得到最终结果   *              f是一个函数指针   *               该指针指向一个函数   *               该函数的返回类型为一个指向整形数组的指针   *********************************************************************/ 例子③  int *(*(*(*f)())[])();                  相信大家根据以上两个例子能推出这个声明的含义了吧,其实就是一层一层的往外面走就是了          最终结果:               声明f是一函数指针,该函数返回一指针,该指针指向数组,数组元素是指针,这些元素指向返回值类型为整型指针的函数</code>

     本文转自Bill_Hoo 51CTO博客,原文链接:http://blog.51cto.com/billhoo/642618,如需转载请自行联系原作者

继续阅读