c语言中复杂声明的解析

来源:互联网 发布:mac变色龙引导 编辑:程序博客网 时间:2024/05/16 00:29

在c语言中声明可以任意复杂,这就导致我们在阅读某些较为复杂的声明时出现问题

解读复杂c声明的一种方法是遵循“声明模仿使用”的阅读方法:

例如:char *(*pfunc)();

*(*pfunc)()是一个char

(*pfunc)() 是一个 指向char的指针

(*pfunc) 是一个 返回char型指针的函数

pfunc 是一个 指向返回char型指针的函数的指针

另外是一种“从内而外”的解读方法

我们一般采用“左右规则

即:先找到标识符,然后看其右边,“[]”为数组,“()”为函数,接着看左边,有“*”即为指针;如此右左,循环往复。

值得注意的是:[]和()的结合度比*更紧。(就注意下优先级)


例子:char * ( * (a [n] ) () ) () ;

先可以找到标识符a,转向其右边,为数组;

然后其左边,是一个*号,说明是指针数组;

新的一轮循环,右边是(),说明是函数。

那么函数的返回是什么呢,看左边*,是指针;

那么指针指向的是什么呢,看右边,是一(),是函数;

那么函数的返回值呢,指向左侧的char*,即:指向字符指针的函数


综上所述,例子定义的是:

一个包含n个指向返回指向字符指针的函数指针数组。


一般我们会用typedef逐步完成声明

比如上例的形式如下:


typedef char *pc;

typedef pc fpc();

typedef fpc *pfpc;

typedef pfpc fpfpc();

typedef fpfpc *pfpfpc;

pfpfpc a[N];