剖析复杂的c的声明

来源:互联网 发布:初级程序员考试培训 编辑:程序博客网 时间:2024/06/06 11:48

学过C语言的应该都见过C中那些让人纠结的声明吧!

比如:

char * const *(*next)();


这么纠结的声明我想如果你不是高手级别的人,应该是不能一下就可以想到的吧,不管看官行不行,反正我不行,哈哈~~~

最近在看C专家编程,上面写了关于这个应该是怎么去剖析它,我觉得真的很不错,应该推荐一下。

按照以下的步骤下去我觉得应该是很容易就解决的:

1.找到标识符(所谓标识符就是那种自己定义的,但不是变量的那种,比如上面的next的)

2.在这个过程中,你一定要牢记右边的优先级比左边的高,所以一定是先看右边再看左边的

2.1 观看标识符的右边,如果是(,  那么就是表示标识符是.....函数

2.2 如果是[的话,表示标识符是一个....数组

2.3 如果观看右边不是上述的情况就看左边

2.3.1 如果左边是*,这表示指向...的指针------>看完以后继续往左边看

2.3.2 如果左边是const,这就表示只读的----->看完以后继续往左边看

2.3.3 如果是(,那就表示你这个部分已经处理完了,然后回到第二步重新进行下面的分析


4.就是一些基本的数据类型,然后连起来就可以了

下面分析一下上面的那个代码


1.首先我找到了那个next

2.我观看右边是),不符合我的定义

3.因为右边不符合,所以我就看左边,看到了*,所以next是一个指向...的指针,然后再往左,发现直接就是(了,那就说明(*next)已经分析完,那么我们回到第二步。

2.看右边是(,也就表示了是一个函数,然后(*next)()就处理完了

3.看左边就是*,也就表明是一个指向...的指针,继续向左,查看到的是const的,说明是只读的,后面就是一个指向char的指针


可以翻译成这样,next是一个指针,他指针函数,这个函数返回一个指针,这个指针指向char的常量指针。

其实就是一层套一层的感觉,感觉和英语的从句很想。


对于const有一个规定是如果在const后面直接跟着数据类型的话,那么const就是修饰这个数据类型的,其他就是用来修饰它左边最邻近的*


下面是一个书上没有的,我在网上找的

int * (* (*fp1) (int) ) [10]; 

1.找到fp1

2.找右边找不到,那就找左边,发现fp1是一个指向..的指针,再向左是( ,则表示(*fp1)这一部分完成

2.找右边是一个函数,那么我们就只是fp1是一个指针,这个指针指向的是一个函数,这个函数的参数是int.

3.向左找,是*,这表示是一个指向..的指针,然后(*(*fp1)(int))就完成了

2.再看右边是一个数组,

3.再左边就是一个int*

那么连来就是fp1是一个指针,这个指针指向的是一个函数,这个函数的参数是int.,它的返回类型是一个数组指针,而这个指针指向的数组是一个指针数组,他的元素是int*


好像就这样了,书上还有一幅图,觉得也特形象,不过上传了..有兴趣可以下电子版看看<<c专家编程>>







原创粉丝点击