在学习C语言的过程中,我们难免会碰到很多的声明语句,那么今天就来讨论一些C语言语句声明的一些规则,这些规则虽然难懂,但是当你明白它声明的原理之后你就会很快的明白。
咱们先从简单的入手,比如说 char * next,大家应该都知道next是一个指向char类型的指针,这个应该很好弄懂,因为char是一个字符声明类型,*是一个指针声明类型。那么接下来我们加深难度 char (*c[10]),这个也应该很好理解c[10]是一个数组,那个*c[10]就说明这个数组的元素是指针的类型,指针是指向char类型的,那么总结的说,就是c[10]是一个指向char类型的数组指针。
那么或者大家应该看出了一些规律,C语言的声明是有一些规律的,有着一些明显的优先级,那么我们总结一下C语言的优先级:
A 声明从它的名字开始读取,然后按照优先级顺序依次读取。
B 优先级从高到低依次是:
B. 1 声明中被括号括起来的那部分
B. 2 后缀操作符:
括号()表示这是一个函数,而方括号[]表示这是一个数组。
B. 3 前缀操作符:星号*表示“指向......的指针”
C 如果const和volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用于类型说明符。在其他情况下,const和volatile关键字作用于它左边紧邻的星号。
好吧,现在规则都介绍完了,那么我们继续深入的探讨一下这些规则是怎么实现的。举个例子: char * const *(*next)(); 首先咱们从规则
A开始吧,找到变量名“next”,发现它是被括号括起来的,那么由优先级高低
B. 1 先解决括号里面的内容,解释为指向......的指针,
B.2考虑括号外面的东西,那么优先级高的明显是右边的函数(),所以得出next是一个指向函数的指针,指向一个返回......的函数,
B.3处理前缀的内容“*”,得出指针所指向的内容,
C最后把char *const解释为指向字符的常量指针。好吧,到这里我们对这个长的分析到此结束,那么它的声明,总结起来就是“next是一个指针,它指向一个函数,该函数的返回值为一个指针,该指针指向一个类型为char的常量指针”,这就大功告成了。
那么可以尝试的用这个方法分析一下这个:char *(* c[10])(int **p);