打印

请教个const 函数指针数组问题~

[复制链接]
3117|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
新手额|  楼主 | 2009-8-20 17:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
eagle758| | 2009-8-20 20:10 | 只看该作者
const  u8 (*fun[2])(u8 code)={fun1,fun2};
这样应该可以了
调用:
(*fun[0])(a);
理解为定义一个函数指针数组,函数的返回值为char 类型

使用特权

评论回复
板凳
etz2009| | 2009-8-21 20:07 | 只看该作者
我也支持二楼的说法

使用特权

评论回复
地板
老树昏鸦| | 2009-8-22 10:34 | 只看该作者
本帖最后由 老树昏鸦 于 2009-8-22 10:50 编辑

潜水多天,终于逮到个有点意思的帖子

函数返回值不是左值。
所以你的声明虽然合法,但没有意义,编译器可能会给出警告,但不会产生错误。


编译错误另有其因,但不是2楼所说的情况。
const u8 (*( fun[2]))(u8 code) = {fun1,fun2};
声明中*号后的一对圆括号作为分隔符没有任何副作用,因此不是产生错误的原因。


如果你想声明指针常量,应该这样使用const类型修饰符:
u8  (* const fun[2])(u8 code) = {fun1,fun2};


调用表达式:
       fun[0](code)
       fun[1](code)

使用特权

评论回复
5
eagle758| | 2009-8-24 08:19 | 只看该作者
:victory:

使用特权

评论回复
6
冷漠| | 2009-8-24 10:36 | 只看该作者
4楼老树昏鸦讲得不错。可惜概念还是没讲清。我们总不能靠死记硬背这种写法吧。谁来讲清楚为什么要这样写?再次遇到这类问题时,应按照什么规则来写?
我倒觉得,只要理解下面化简的数组说明规则:才能写好函数数组说明:
(* const fun[2])

那么问题很简单了:根据  void (*fun)(void)=fun1;   
扩展成数组说明即可。

2楼的写法非法:C规则:“类型限定符(这里是const)不得出现在函数结果类型说明或参数说明中。”

使用特权

评论回复
7
lanmp| | 2009-8-24 11:17 | 只看该作者
*说明这个数组的成员是指针,const说明是常量。const  u8 (*fun[2]) 这个const和u8是连在一起的。说明这个函数的返回值是个const u8类型。总之就是const要接近被修饰东西。再换一种,如果写成(const * fun[2])应该就变成指向常量的非常指针了。对吧。

使用特权

评论回复
8
o蓝玉莹| | 2009-8-28 09:25 | 只看该作者
本帖最后由 o蓝玉莹 于 2009-8-28 11:32 编辑

记住几个运算符优先级很难吗?
记住下面几句话很难吗?

    ...指针指向...
    ...函数返回...
    ...数组元素是...

    ...const类型是...
    ...volatile类型是...


本姑娘来解释下吧。

第一个:
    const * fun[]
先找到事主----fun

fun左边有运算符“*”,右边是运算符“[]”,[]是后缀运算符优先级最高,所以fun与[]组合。读出来就是:
    fun是数组,数组元素是指针,指针指向const(常量)

第二个:
    * const fun[]
先找到事主----fun

fun左边没有运算符,右边有运算符“[]”,所以fun与[]组合。读出来就是:
    fun是数组,数组元素是const(常量),const类型是指针


另:6楼的解释是不对的:const经常用在函数参数说明中



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

34

帖子

0

粉丝