具体内容详见 http://c-faq.com/decl/spiral.anderson.html
一种很好用的判断C语言声明时变量语义的方法——螺旋顺时针法
示例#1
char *str[10];
从str出发,顺时针旋转,遇到的第一个部分是"[10]", 说明str是一个10个元素的数组;
继续顺时针旋转,遇到了指针符号'*',说明这是10个元素都是指针;
继续旋转,遇到了"char",说明这些指针是指向char类型变量的。
示例#2
char *(*fp)( int, float *);
变量名是"fp",如上例,顺时针旋转,由于这个变量名是被括号包裹的,所以先遇到的会是*,说明这个变量是一个指针;
接下来遇到了"(int, float *)",说明这个指针指向了一个函数。这是个怎么样的函数呢?继续旋转,遇到了'*',说明返回值是一个指针,这个指针指向的是一个char。
示例#3
void (*signal(int, void (*fp)(int)))(int);
这个例子比较复杂。我们首先来看"signal"是什么。
根据上边的例子可以看出来,"signal"是一个函数,函数的形参类型分别是一个integer和fp。
我们再分析fp是什么类型: 同样根据上边的例子可以看出来, fp是一个指向函数的指针,这个函数接收一个integer返回void。
继续回到"signal",已经知道这是一个函数了,那么这个函数的返回值是多少呢,很明显是一个指针,这个指针是一个指向一个函数的指针。
这个函数接收一个integer,返回void。
这个方法还可以应用在判断const修饰的到底是一个指针还是一个其他类型。