本篇主要记录我现在对C语言中复杂声明的理解,以供以后的我参考。

我对复杂声明的疑惑是从一个并不怎么复杂的声明开始的:

1
2
char *a[];
char (*a)[];

我的本意是声明一个指针数组,每个数组元素再指向一个字符串。当时我就开始迷惑到底是第一行的声明还是第二行的声明?然后我用了最直接的方法,两种都试了一下,发现第一种是正确的。以上虽然解决的眼前的问题,但作为处女座的我本能地想搞清楚对于这种声明应该怎么理解,经过搜索总结出了我自己的方法。

从网上搜索得到的最重要的一条准则是:C语言中的声明和使用是相一致的(大多数情况下)。例如声明char *a*为取值符号,对a取值为char类型,那反过来a就是指向char类型的指针。

就以char *a[];为例,我会列出几个逻辑关系式

  1. a是一个数组,因为它先和[]结合
  2. a[]char *类型的,这里a[]可以认为是a数组中的某一个元素

从以上两条可知这个声明就是我所需要的。而再看看第二个声明表达的意思是什么。

  1. a是一个指针,因为它先和*结合
  2. *a是一个数组
  3. (*a)[]char类型的

由此可知a是指向一个char数组的指针。

继续复杂一点的char *p(char *a, int (*b)(int));

写到这里觉得这种声明还是太简单了,好像没必要讲。。。。。