对于一个函数:
void func(void);
我们通常可以定义一个这样的函数指针指向它:
void (*p)(void) = func;
通过p调用func时,通常有两种写法:
p();或者(*p)();
围绕这两种写法,当初C89制定的时候曾经有过争论。(*p)();是一种旧式的规定,旧式规定圆括号左边必须具有“函数”类型,如果是指向函数的指针,那么必须加上*声明符。但C89不再把圆括号的左边限定为“函数”类型,而是一个后缀表达式。那么问题就来了,如果p的值是函数地址,那么*号就是声明符,但如果p指向的内容是函数地址,*号就得被看作运算符了。同一种形式会有两种解释,这是一个矛盾。不仅函数调用如此,指向数组的指针也存在这种矛盾。编译器为了处理这种情况得增加代码,效率自然就降低了。争论的最后结果是谁也不能把对方完全说服,于是就干脆两种都支持了。笔者认为应该抛弃旧式的规定,p();这种形式简洁明了,又符合函数的一般形式,何乐而不为?
第八章练习的答案,同时给出用typedef的分解方法:
int (*(*func)[5][6])[7][8];
func是一个指向数组的指针,这类数组的元素是一个具有5X6个int元素的二维数组,而这个二维数组的元素又是一个二维数组。
typedef int (*PARA)[7][8];
typedef PARA (*func)[5][6];
int (*(*(*func)(int *))[5])(int *);
func是一个函数指针,这类函数的返回值是一个指向数组的指针,所指向数组的元素也是函数指针,指向的函数具有int*形参,返回值为int。
typedef int (*PARA1)(int*);
typedef PARA1 (*PARA2)[5];
typedef PARA2 (*func)(int*);
int (*(*func[7][8][9])(int*))[5];
func是一个数组,这个数组的元素是函数指针,这类函数具有int*的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。
typedef int (*PARA1)[5];
typedef PARA1 (*PARA2)(int*);
typedef PARA2 func[7][8][9];
你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=2943048
|
- 评论人:icuit
2006-06-18 04:20:35
|
|||
看完了,作者写的不错,只是自己理解得还不够深。还须琢磨。
|
||||
|
- 评论人:祝蜚
2005-12-29 21:29:44
|
|||
很能解释问题,如果作者把指针和地址互相转化一下那就更顺畅了.
|
||||
|
- 评论人:jsjjms
2005-10-22 13:43:28
|
|||
看完,受益非浅,总以为自己懂了不少,但细细地看一下,发现自己知道远只是一个皮毛。
|
||||
|
- 评论人:董
2005-10-11 21:04:33
|
|||
我读完了你 的文章, 应该说花了一定心思, 呵呵 ,可惜你写得晚了点,不然我就可以节约点时间了. 现在看了就觉得不激动了,看来我是真的掌握指针了.我给点建议:
|
||||
|
- 评论人:megaboy
2005-09-26 09:26:54
|
|||
当然可以啊,只要是非赢利性的,无所谓。
|
||||
|
- 评论人:我为C狂
2005-09-25 22:19:57
|
|||
我能不能在我自己的blog中转载你的文章呢?当然会把出处说清楚的。 |
||||
|
- 评论人:我为C狂
2005-09-25 21:57:49
|
|||
vikingemail说收获不大,说明他理解了哈^_^
|
||||
|
- 评论人:megaboy
2005-09-19 08:02:27
|
|||
非常感谢你花这么多时间阅读我的文章,现在blog里面这样的人已经不多了。大多一片浮燥心理,作者的思想还没了解清楚就在那里狂喊乱叫,有骂人的,有看热闹的,真正能静下心来讨论问题的人没几个,鲜少能说出自己的观点和理由的。尊重别人的人才会得到别人的尊重,尊重别人就是对自己的尊重。
|
||||
|
- 评论人:vikingemail
2005-09-18 23:26:17
|
|||
认真地看完了,从开头到结束,感觉有收获,但是不象你开头写的想象的那么大。
|
||||