- -| 回首页 | 2005年索引 | - -第九章 指针与const

第十章 围绕p()与(*p)()的争论

                                      

        对于一个函数:

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];

【作者: megaboy】【访问统计:】【2005年09月16日 星期五 20:21】【 加入博采】【打印

Trackback

你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=2943048

博客手拉手

回复

- 评论人:icuit   2006-06-18 04:20:35   

看完了,作者写的不错,只是自己理解得还不够深。还须琢磨。
我转载了你的文章,并且标明了出处,不介意吧。

- 评论人:祝蜚   2005-12-29 21:29:44   

很能解释问题,如果作者把指针和地址互相转化一下那就更顺畅了.
我们常说整数型指针字符型指针.......指针是它们的统称,你在C中见过无类型的指针吗?可能你会想到void型的,但void也是一种类型,只不过它特殊了一点.指针有属性,有方法.这是类型的基本特征.
如果把指针想象成索引把地址想象成一段内存.那指针里又怎包含地址?小的包含大的?

- 评论人:jsjjms   2005-10-22 13:43:28   

看完,受益非浅,总以为自己懂了不少,但细细地看一下,发现自己知道远只是一个皮毛。

谢谢了。

- 评论人:董   2005-10-11 21:04:33   

我读完了你 的文章, 应该说花了一定心思, 呵呵 ,可惜你写得晚了点,不然我就可以节约点时间了. 现在看了就觉得不激动了,看来我是真的掌握指针了.我给点建议:
你应该多给点代码,给个具体例子,让读者自己去运行 ! 有个感性认识就好理解指针了 ! 不管怎样,支持你!

- 评论人:megaboy   2005-09-26 09:26:54   

当然可以啊,只要是非赢利性的,无所谓。

还有,这篇文章也发表在我另一个blog里面了:

http://blog.csdn.net/megaboy

- 评论人:我为C狂   2005-09-25 22:19:57   

我能不能在我自己的blog中转载你的文章呢?当然会把出处说清楚的。

- 评论人:我为C狂   2005-09-25 21:57:49   

vikingemail说收获不大,说明他理解了哈^_^

我今天把所有的文章也都好好读了一遍,由于上次在CSDN中已经有了相关讨论,所以这次读的时候大部分确实感觉比较容易接受。

我不属于头脑聪敏之人,学识尚不精,对于指针的复杂声明等偏后偏深的内容还没有彻底掌握,但是我的确很赞同megaboy对于指针和数组的观点。感觉对指针的把握也更深入了一层。

先谢谢megaboy了!

- 评论人:megaboy   2005-09-19 08:02:27   

非常感谢你花这么多时间阅读我的文章,现在blog里面这样的人已经不多了。大多一片浮燥心理,作者的思想还没了解清楚就在那里狂喊乱叫,有骂人的,有看热闹的,真正能静下心来讨论问题的人没几个,鲜少能说出自己的观点和理由的。尊重别人的人才会得到别人的尊重,尊重别人就是对自己的尊重。

有收获就好,写一篇文章出来最大的希望就是让阅读的人不会空手而回。当然各人的情况不同,产生的共鸣必然是不同的。当初在论坛里、在blog里,甚至在生活中,看到不少人对一些关于指针和数组的基本概念理解得一塌糊涂,其中不乏在C世界滚打了多年的程序员,可以用惨不忍睹四个字来形容。有的人还很顽固,用一些错误的理由来证明自己的观点。有感于此,觉得很有写一篇文章的必要,于是就有了第一章,这是写这篇文章最初的想法,针对的是那些对基本概念还不清晰的程序员。但写完了第一二章,觉得还是索性把其它内容也写进去的好,所以就有了后面八章。

- 评论人:vikingemail   2005-09-18 23:26:17   

认真地看完了,从开头到结束,感觉有收获,但是不象你开头写的想象的那么大。

不错,谢谢分享。

验证码:   
评论内容: