函数指针的透彻分析

 

我知道函数指针是指向函数的指针,指针函数还是指一个函数的返回值是一个指针,但下面

的几道题还是感觉很迷惑。各位能否讲的详细点呢?

(1)float(**def)[10]  def是什么?



(2)double*(*gh)[10]  gh 是什么?



(3)double(*f[10])()  f是什么?



(4)int*((*b)[10]) b是什么?



这样老感觉有点乱,有什么窍门可以记得并理解的清楚一点么?



(1) def是一个指针, 指向的对象也是一个指针, 指向的指针最终指向的是10个float 构成的

数组.



(2)gh是指针, 指向的是10个元素构成的数组, 数组的元素是double*类型的指针.



(3)f是10个元素构成的数组, 每个元素是指针, 指针指向的是函数, 函数类型为无参数且返

回值为double. 下面要讲的窍门的例子跟这个很类似.



(4)b是指针,指向的是10个元素构成的数组, 数组元素为int*类型的指针.



窍门如下:



如果我们碰到复杂的类型声明,该如何解析它?例如:

char(*a[3])(int);

a到底被声明为什么东东?指针?数组?还是函数?

分析时,从a 最接近(按运算符优先级)处开始。我们看到a最接近符号是[]——注意:*

比[]的优先级低。a后既然有[],那么a是数组,而且是包含3个元素的数组。

那这个数组的每个元素是什么类型呢?虽然数组a只含有a[0]、a[1]、a[2]三个元素,a[3]实

际上已经越界,但在分析数组a的元素的类型时,我们正好需要形式上的元素a[3]。知道了

a[3]的类型,就知道了a的元素的类型。 a[3]是什么类型?是指针,因为它的前面有*. 由此

可知,数组a的元素是指针。

光说是指针还不够。对于指针,必须说出它指向的东东是什么类型。它指向的东东是什么,

就看*a[3]是什么(a[3]是指针,它指向的东东当然是*a[3])了。继续按优先级观察,我们看

到*a[3]后面有小括号,所以可以肯定*a[3]是函数。即数组a的元素是指向函数的指针。

指向的是什么类型的函数?这很明显,是入参为int、返回值为char的类型的函数。

至此解析完毕。


----------------------- Page 2-----------------------

按上述方法,再复杂的也可以一步步解析出来。



就像习武不是为了打人而是为了防身一样,我们了解上述方法是为了看懂别人写的复杂声

明,而不是为了在实践中自己去构造这种复杂的东东。实在需要复杂声明时,可以用typedef

替代一部分。例如上面语句可改成两句:

typedefchar(*FUN_PTR)(int);

FUN_PTR a[3];

这样就清晰多了。

此外,上面的分析方法还让我们对某些东西的本质更加清楚。比如,n维数组的本质都是一

维数组。看个具体的例子:

inta[3][5];

这句声明的是一个包含3个元素的一维数组,其每个元素又是一个由5个int数构成的数组。

我们不能理解为:a是一个包含5 个元素的一维数组,其每个元素又是一个由3 个int 数构

成的数组。为什么?还是按上面的方法分析,这里从略。



有的书上或网上提供"向右看,向左看"的方法, 其实缺乏通用性, 比如它不适用于对多维数

组本质的分析. 而且这种方法掩盖了本质. 本质应该是按上面所讲的,根据运算符优先级逐

层剥开.


转载于:https://www.cnblogs.com/yuzaipiaofei/archive/2012/02/16/4124268.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值