分析C语言声明的通用方法(经典——来自C专家编程)

C语言由于其形式的灵活、符号的复用以及优先级的复杂性导致了某些声明晦涩难懂。比如下面两种声明:
char *const *(next) ();
char *(*c[10]) (int **p);

对于不仅是初学者来说都不是简单的问题。那么我们应该如何来解析这种声明呢?
在《C专家编程》的Page65给出了一个较为通用的方法,细细体会,受益匪浅。
方法如下:
步骤1.取最左边的标识符(比如变量的标识符)          表示标识符是
步骤2.查看标识符右边的下一个符号,如果是方括号    对于每一对,表示“……的数组”
步骤3.如果是一个左括号                                        与右括号组成函数参数的放置,确定这是一个返回……的函数
步骤4.查看标识符左边的符号,如果是左括号             这个括号把已经处理的声明组合在一起,知道遇见对应的右括号,然后从第2步开始
步骤5.如果左边符号是下述之一
const
volatile
*                                                                        继续向左边读符号,知道所读不是这三者之一(const表示只读,volatile表示“volatile”,*表示指向……的指针)。然后重复第4步
步骤6.剩下的符号形成声明的基本类型                       一并读取,如static unsigned int

=======================================
备注:上述方法有回返处理的过程。读起来比较难懂一点。不果根据我的个人经验,大家可以记住两点;1.首先找出最左边的那个标识符——变量最常见。2.读取完标识符首先查看标识符的右边,如果有圆括弧则为函数,为[]是数组,然后再看左边的符号。
再简练点就是:最左边标识符,其右、其左。
=======================================
解析上述声明:
char *const *(*next) ();

找到最左边的标识符next,看其右,非()或[]而是);看其左,为*,说明next是一个指针变量。再看其左,为(,那么再看其右,(),函数。这个指针变量指向一个函数。看其右, *,说明这个函数返回一个指针,这个指针指向一个char的常量指针(char *const)。
char *(*c[10]) (int **p);

利用现有的经验来得更简单和快捷:
这是一个数组c[10],这个数组为指针类型(每个元素都是一个指针变量),每个指针变量指向一个参数为int **p,返回值为char *的函数。

你可能感兴趣的:(编程,C++,c,C#)