遥感数据处理工程师:C语言声明_指针数组和数组指针

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 16:25:35

如果说C语言声明很简单的人不是牛人就是还没入门。本文来讲解C语言的声明的一些基本内容,很多内容参考《c专家编程》。首先由一个最简单的问题引入,你知道int * p[5] 和 int (*p)[5] 的区别在哪里吗?把后面的答案遮到,想想。也许你知道反正一个是含有五个指向整型的指针元素的指针数组,另一个是指向一个拥有5个整型元素的数组的指针,具体呢?

int *p[5]是一个含有五个整型指针的数组,int(*p)[5]是一个指向5个整型元素的数组指针。如果你能分清楚,恭喜你,你起码是入门级以上的水平。那这个呢, char * const *(*next)()?

如果你能把上面这句声明清清楚楚明明白白的说出来,下面你不用看了,下面的东西对你来说都是废话。

首先我们需要理解C语言的声明的优先级规则,如下:

A   声明从它的名字开始读取,然后按照优先级顺序来依次读取。

B   优先级从高到低依次是:

B.1      生命中被括号括起来的那部分

B.2      后缀操作符

           括号()表示这是一个函数,而方括号[]表示这是一个数组

B.3      前缀操作符: 星号*表示 指向...的指针

C   如果const在指针星号前他作用于指针指向的变量,如果const在指针星号后他作用于指针

      另一种说法是,const修饰的是它前面的类型,如果它前面没有类型则修饰的是紧跟其后的类型

      如 const int * a; int const * a; int * const a;前两个const在*之前,指针所指向的变量是只读,最后一个是指针本身只读。

我们开始解析上面的声明

适用规则           解释

A              首先,看变量名"next",并注意到它直接被括号所括住

B.1           所以先把括号里面的东西作为一个整体,得出"next是一个指向...的指针"

B              然后考虑括号外面的东西,在星号前缀和括号后缀之间做出选择

B.2            规则告诉我们优先级较高的是右边的函数括号,所以得出"next是一个函数指针,指向一个返回...的函数" 

B.3                 然后,处理前缀"*",得出指针所指的内容

C              最后,把"char* const"解释为指向字符的常量指针

      所以综上所述,这个式子的真正的含义是:next是一个指针,它指向一个函数,该函数返回另一个指针,该指针指向一个类型为char的常量指针。

其实理解这个最基本的优先级是需要理解的运算符的优先级:如下顺序

操作符                                    结合性

() [] -> .                                      左到右

! - ++ -- + - *& sizeof                       右到左

* / %                                    左到右

+ -                                              左到右

<< >>                                 左到右

< <= >>=                                  左到右

== !=                                    左到右

&                                          左到右

^                                          左到右

|                                           左到右

&&                                              左到右

||                                          左到右

?:                                            右到左

= += -= *=  /=%= ^= |= <<= >>=       右到左

,                                           左到右

 

原文来源:http://blog.csdn.net/huiguixian/archive/2011/05/14/6419261.aspx