本篇主要记录我现在对 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));

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