函数fp()、数组a[i]和箭头符号->的由来

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语言提供了一个更为方便的操作符来完成这项工作,也就是箭头操作符->

它接收两个参数,左侧的参数必须是指向结构的指针!

 

注:这样,“.”和“->”这两个符号的区别就一目了然:

一个是从结构取元素;一个是从指向结构的指针取元素.

posted @ 2012-01-06 18:06  balaamwe  阅读(689)  评论(0编辑  收藏  举报