书部落-计算机PDF电子书之家 » 学习经验·技术心得·答疑解惑 » C/C++语言学习小组 » 《再再论指针》 第十章 围绕p()与(*p)()的争论


2007-2-26 00:15 shubulo
《再再论指针》 第十章 围绕p()与(*p)()的争论

第十章 围绕p()与(*p)()的争论 \e[q#I5Q
        对于一个函数:n`+W"BC(^

/n][#E0o+G la void func(void);
_ Pd)}+L~v
uf)k$Cn QK 我们通常可以定义一个这样的函数指针指向它:
sX? Il:Mx g@,`9F~8{8~
void (*p)(void) = func;X]gp+^

K#Y&tr_y0{4^5I(|P 通过p调用func时,通常有两种写法:#Lw#t1D+jT"_)^e

*Q1o6[2OuB+A2}P|-h:K p();或者(*p)();
E:u2s'HiBcG U7x_ s"Bo'y l(m
围绕这两种写法,当初C89制定的时候曾经有过争论。(*p)();是一种旧式的规定,旧式规定圆括号左边必须具有“函数”类型,如果是指向函数的指针,那么必须加上*声明符。但C89不再把圆括号的左边限定为“函数”类型,而是一个后缀表达式。那么问题就来了,如果p的值是函数地址,那么*号就是声明符,但如果p指向的内容是函数地址,*号就得被看作运算符了。同一种形式会有两种解释,这是一个矛盾。不仅函数调用如此,指向数组的指针也存在这种矛盾。编译器为了处理这种情况得增加代码,效率自然就降低了。争论的最后结果是谁也不能把对方完全说服,于是就干脆两种都支持了。笔者认为应该抛弃旧式的规定,p();这种形式简洁明了,又符合函数的一般形式,何乐而不为?
:I#z:{?QK,L /h't\Z i-T%]*B.jF

]1s(L m0ve[7i         第八章练习的答案,同时给出用typedef的分解方法:+b"]+Q"w&t_Y
u zh*j(cP

+XR,BaCzS O int (*(*func)[5][6])[7][8];
g2g1e1x4qe Q ^2Uy8K
func是一个指向数组的指针,这类数组的元素是一个具有5X6个int元素的二维数组,而这个二维数组的元素又是一个二维数组。kQ6oS1ml,C

xZ4yV,t#K typedef int (*PARA)[7][8];
l6l:P7p+r5j\ g typedef PARA (*func)[5][6];
m2pg;V(p$sT*qCZ rpG&Bp2aL dH

2Z3@zR0t;i?9`%x int (*(*(*func)(int *))[5])(int *);
5HR:v"Kzh ^R"o%wt2I0ZK o
func是一个函数指针,这类函数的返回值是一个指向数组的指针,所指向数组的元素也是函数指针,指向的函数具有int*形参,返回值为int。
`s/t(m7my*~cahvw
1uGI%RdS typedef int (*PARA1)(int*);
8t2aBbFu:E typedef PARA1 (*PARA2)[5];k%vIgJq0B:f cq
typedef PARA2 (*func)(int*);Z+d)B2F,~

D]7Nfc4bt int (*(*func[7][8][9])(int*))[5];6w2Y&Ky"XJhe8D

hO9mo@Q0Z3s:Y func是一个数组,这个数组的元素是函数指针,这类函数具有int*的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。
K.\w!XFV *y,\7]#nQq2y;Yb
typedef int (*PARA1)[5];K#J }1H:lG6E2^:w
typedef PARA1 (*PARA2)(int*); G,G'w)y%m stA
typedef PARA2 func[7][8][9];

2007-2-28 10:03 jackydi
好文章,保存下来好好看看。

2007-9-12 10:11 红影
上面终于少了那个发表情灌水的。。。2k]7KG2lph5AZb:yP)r
我还以为楼上的你和他一伙的呢

2008-11-9 13:48 lyshyhuangli
有点看不懂啊!
,M+J_qm)t8AQ6` 有点深

页: [1]


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.