分享

C语言中的复杂声明

 own360 2013-08-06

终于决定开c言语这一块的文章啦,昨天看了一下c的声明,发现网上虽然有很多人在说这件事情,但是都不太透彻,我自己认为我这个理解方式比较简单,而且实用,可以对付任何复杂的声明,比如:char *(*(*f(char *(*para)(char *)))[2])();是不是一看这个声明有点懵?不急,来看看我下面的解析你就觉得这个声明也很简单!

  复杂声明中的类型说明符有:()[]*三种。其中()用于说明函数类型以及改变说明的先后顺序;[]用于说明数组类型;*则用于说明指针类型。数据类型名可以是int、char、float、double、void等基本类型名,也可以是用户自定义的构造类型。在解释复杂声明时,要按照()[]优先级最高,*次之,而数据类型名的优先级最低的顺序来解释。当()[]同时在复杂声明中出现时,就需要考虑类型说明符的结合性。C语言规定,类型说明符()[]的结合性是左结合,即按从左至右的顺序进行解释。

  本文为了逻辑清楚,在后面的例子中都会按照优先级的顺序,将各个类型说明符按从左到右通过箭头连接的方式来说明。

  对于不同的类型说明符,有不同的处理方式。

  如果类型说明符为指针,则下一步按照优先级,来判断指针指向的内容的类型。

    如果类型为函数,首先判断(???)的参数???的类型,下一步按照优先级判断返回值的类型。

    如果类型为数组,下一步按照优先级来判断数组中内容的类型。

  根据上面三条规则,递归整个声明表达式,就可以完全的解释声明的内容了。

下面来一些例子说明一下:

int (*func)(int);

提取出各个片段之后为:

func -->*-->(int)-->int

通过()改变了结合顺序,所以func先和*结合,判断func为指针。下一步判断这个指针指向的内容,(*func)(int)右面是一个函数类型说明符,所以func指向的是一个函数,func为函数指针(func变量的所有信息都已经声明完毕)。接着去判断func指向的函数,(int)说明这个函数接收一个int类型的参数。最后看这个返回值,是int类型。所以总结如下:

func是一个函数指针,指向一个接收一个int类型参数并且返回值为int类型的函数。

int (*func[5])(int *p);

提取出各个片段之后为:

func-->[5]-->*-->(int *p)-->int

由于[]的优先级要高于*,所以func先和[5]结合,所以func是一个五个元素的数组。下一步判断数组中的内容。接下来是一个*说明这个数组中的内容为指针。下一步判断这个指针的类型,(int *p)表示这个指针为一个函数指针,指向的函数参数为一个int指针,下一步判断返回值,int,说明这个函数返回值的类型是int。

总结:func是一个数组,数组中的每一个元素都是一个函数指针,指向的函数接收一个int指针参数并返回一个int值。

 

int *func(int *)[5];

提取出各个片段:

func-->(int *)-->[5]-->*-->int

func与(int *)结合,说明func为一个函数,改函数的参数为int *,下面判断返回值:返回一个数组[5],然后判断数组里面的元素类型,为指针(*),指针指向一个int。所以总结:

func是一个接收一个int *的函数,返回值为包含5个元素的数组,数组元素为指针类型,并且指向int类型。

PS:这个例子的逻辑说明没有问题,但是实际上是一个不合法的变量声明,因为这个函数返回了一个数组,实际上,在c中是不允许函数返回值为一个数组的。

相信到了这个地方,你对c语言的复杂声明有了一定的了解,接下来我们就来说开头那个最复杂的变量声明!!

 

char *(*(*f(char *(*para)(char *)))[2])();

解释的顺序还是按照上面的顺序来:

f-->(char *(*para)(char *))-->*-->[2]-->*-->()-->*-->char

         1                    2    3    4    5   6     7

看上去挺恐怖的吧,看我一一道来

f与1最先结合,说明f是一个函数,这个函数接收一个char *(*para)(char *)这种类型的参数。

先判断这个参数的类型:para-->*-->(char *)-->char

para是一个指针,指向一个接收一个char *并返回一个char的函数。

所以f是一个函数,这个函数接收的参数为指向一个接收一个char *参数并返回一个char的函数。

接下来分析f函数的返回值:2为*,所以返回值为一个指针,接下来分析指向的内容,3为[2],所以指针指向一个包含2个元素的数组,下面分析数组的元素类型,4为*,所以数组中的类型为指针,分析指针指向的内容,5为(),所以这个指针指向一个参数为空的函数,这个函数的返回值类型为6*(指针),并且指向一个7char类型。

所以综上分析:f是一个函数,这个函数接收一个函数指针作为参数,这个函数指针指向一个接收char *参数,并返回一个char的函数,f的返回值为一个指向一个包含两个元素的数组的指针,数组中包含的元类型为一个函数指针,该函数指针指向一个参数为空,返回一个char *的函数。

是不是很简单呢?嘿嘿

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多