http://blog.csdn.net/nowdoit/article/details/6145340
很多事物的由来都是有理由的,现在看似晦涩难解的符号token,背后都是有一段历史!
1. fp()只是一种简写方式
fp()是一个函数指针,所以*fp就是该指针指向的函数,所以(*fp)()就是调用该函数的方式。
也就是 (*fp)() 和 fp() 是同一个意思;
ANSI C 标准规定允许程序员将上式简写成 fp(),但是要记住,这只是一种简写方式罢了!
这样的话,在查看定义比较复杂的函数时候,就能容易理解了!比如(*(void(*)()0)()。
2. 数组a[i]的由来.
首先我们定义一个数组,a[i];然后定义一个指针,当然类型和a[i]类型一致;
进行赋值p = a;这句话的含义就是说,将a[i]的首地址赋值给指针p;
所以就有p是指向数组a中第0个元素的,那么p+1就指向数组a中下标为1的元素;可以这样写,
p = p+1;也就是p++;其实也就等同于*(a+1)的元素值,以此类推,*(a+i)就表示指向第i个元素;
这种情况是如此的常用,因此被简记为a[i],表示对a+i的引用!
实际上,a+i和i+a是一个意思,因此,a[i] 也就 == i[a];是不是很神奇?!
注:数组a[i]除了用作运算符sizeof(a)之外,这里a表示整个数组的大小;
其他情况,都是表示数组a中下标为0的元素的指针!
3.箭头操作符 ->的由来.
首先我们定义一个结构体,struct COMPLEX *cp;很明显,cp是指向这个结构的指针;
那我们要想获取这个结构体中的元素,该怎么办呢?
首先对指针执行间接操作,获得结构;然后用点操作符访问它的成员;
也就是(*cp).a;之所以加括号,是因为操作符优先级的原因!
这样写是如此的繁琐,于是C语言提供了一个更为方便的操作符来完成这项工作,也就是箭头操作符->
它接收两个参数,左侧的参数必须是指向结构的指针!
注:这样,“.”和“->”这两个符号的区别就一目了然:
一个是从结构取元素;一个是从指向结构的指针取元素.