在分辨这些重要的概念时,我们先回顾一下前面所讲的C之三值合一,由于三个值所求出的地址是相同的,所以经常有传言说他们都是首元素的地址。这种说法是不正确的。为什么说它是不正确的呢?
首先定义一个指针,将三个值赋给它
*p=ar;
*p=&ar[0];
*p=&ar//出错
程序编译后在表达式*p=&ar时出错,说明ar并不是指针类型。ar是数组名代表的是整个空间,因此ar应该是数组指针。
这四个概念看起来很容易混淆,但实际上只需要记住再看这些概念的时候先看后两个字,就可以看出它的类型,如指针数组的本质是数组,指针函数的本质是函数,数组指针和函数指针的本质是指针。接着我们需要明白一点:括号的优先级大于*的优先级,明白这个有什么用呢?我们接着往下看:
Int (*p)[];
Int *p[];
Int (*p)();
Int *p();
上述四个定义式都很相似,但是他们所定义的都是不同的内容。首先看第一个式子和第二个式子,他们的相同点是都有方括号,这说明他们都与数组有关,而他们之间的区别好像只差一个括号,但其实不然,由于括号的优先级大于*,第一个式子的*与p结合,所以他是元素为*p的指针数组,而第二个式子的p先与[]结合,他的类型是int*因此它为数组指针。经过上面的分析,就能很容易的判断出来第三个式子定义的是指针函数,第四个式子是函数指针。
经过上面的分析我们总结一个分辨他们的小方法:有[]的为数组,有()的为函数,指针有括号为函数或数组,没有括号的为指针。