拈花小仙 发表于 2014-4-8 18:04:50

(*(char**(*) (char **,char **))0) ( char **,char **);

本帖最后由 拈花小仙 于 2014-7-6 00:36 编辑

(*(void(*) ())0)();
这是《C Traps and Pitfalls》这本经典的书中的一个例子。没有发狂吧?下面我们就来分
析分析:
第一步:void(*) (),可以明白这是一个函数指针类型。这个函数没有参数,没有返回值。
第二步:(void(*) ())0,这是将0强制转换为函数指针类型,0是一个地址,也就是说一
个函数存在首地址为0的一段区域内。
第三步:(*(void(*) ())0),这是取0地址开始的一段内存里面的内容,其内容就是保存
在首地址为0的一段区域内的函数。
第四步:(*(void(*) ())0)(),这是函数调用。

书中的课后题,我看了前面的,看这个还是不太懂
(*(char**(*) (char **,char **))0) ( char **,char **);//书中的例子,这个帮我分析下,谢谢!



C++编程小组

仰望天上的光 发表于 2014-4-8 18:04:51

牡丹花下死做鬼 发表于 2014-4-11 16:46 static/image/common/back.gif
按照他的意思我猜就是
(*(char**(*) (char **,char **))0) ( char **,char **);
char**(*)是一个函数指 ...

呵呵,刚才没看到你的回复,前面分析得对,最后一步分析错了,调用函数,最右边括号里必是实参

拈花小仙 发表于 2014-4-8 19:02:48

ginger77 发表于 2014-4-8 18:29 static/image/common/back.gif
等大神来回答学习学习

如果不会最好别回复,因为大神看到有人回复了,就不来回复了,咱们就学不到东西了{:7_181:}

拈花小仙 发表于 2014-4-8 19:14:05

ginger77 发表于 2014-4-8 19:06 static/image/common/back.gif
抱歉
不过问题还没解决 会有人来回的

没关系,还很多未解决的呢,开时高手以为有人回复了就不看了,最后沉了下去

拈花小仙 发表于 2014-4-8 19:22:59

ginger77 发表于 2014-4-8 19:19 static/image/common/back.gif
索哒斯勒。。。

他们一般不会看回复很多次的,因为他们会误以为提问者这么多答案都不采纳,可能是不怎么上论坛了,可能是都不满意很苛刻,一般都不会看的,没事哦,我只是开个玩笑,嘻{:7_174:}

拈花小仙 发表于 2014-4-8 19:36:24

ginger77 发表于 2014-4-8 19:26 static/image/common/back.gif
嗯 跟您这里也学到东西了
看得出来您很好学的

{:7_166:}我很好问,嘻嘻

拈花小仙 发表于 2014-4-8 19:44:46

ginger77 发表于 2014-4-8 19:40 static/image/common/back.gif
不过,跟“好问"的意思也差不多啦

学东西就是要 不耻下问 嘛

{:7_158:}嘻嘻,谢谢哈

向往青莲 发表于 2014-4-8 21:18:29

我擦。。。我还以为有人回复了呢? 10多条回复。。。。结果。。。。。

向往青莲 发表于 2014-4-8 21:22:38

解析如下。。。。
(                  *(          char**(*) (char **,char **)      )0          )      ( char **,char **);
额。。。好吧。。。我不懂。。。我擦。。。。。这他妈是啥渣渣书啊?
SB么。。。出这种蛋疼的。。东东。。。。。。考智商啊。。。
顺便说一下。。。你确定是这样?。。上下文没什么交代。。。不对啊。。总感觉。。。

拈花小仙 发表于 2014-4-8 21:33:30

向往青莲 发表于 2014-4-8 21:22 static/image/common/back.gif
解析如下。。。。
(                  *(          char**(*) (char **,char **)      )0          )      ...

上面还有个题没看懂,下面是考题,更不懂了

拈花小仙 发表于 2014-4-8 21:34:50

向往青莲 发表于 2014-4-8 21:22 static/image/common/back.gif
解析如下。。。。
(                  *(          char**(*) (char **,char **)      )0          )      ...

C语言深度解析书上的题,目地不是为了有用,只是考大家对指针的理解,能分清优先级,通过优先级和指针的一些基础来判断,也就是通过一些对指针的掌握来推断,可是我指针学的很差

向往青莲 发表于 2014-4-8 21:41:07

不必要的。。。我指针以前也掌握的不是很棒。。。。但是在使用的过程中。。。慢慢就会好一点的。。。。
重点在实践。。。这种书。。浏览一遍就行了。。。。。。。。ps:(没有人会写这种代码徳。。。如果今天写了。。明天就丢饭碗了。。)

拈花小仙 发表于 2014-4-8 22:08:03

向往青莲 发表于 2014-4-8 21:41 static/image/common/back.gif
不必要的。。。我指针以前也掌握的不是很棒。。。。但是在使用的过程中。。。慢慢就会好一点的。。。。
重 ...
{:7_181:}这题的目地不是教这么写,而是通过对鼠标的理解来推测出这个的用法

向往青莲 发表于 2014-4-8 22:42:49

拈花小仙 发表于 2014-4-8 22:08 static/image/common/back.gif
这题的目地不是教这么写,而是通过对鼠标的理解来推测出这个的用法

那你慢慢推测吧。。←_←。。。
反正我是不会哈。。→_→。。。

拈花小仙 发表于 2014-4-8 22:52:18

向往青莲 发表于 2014-4-8 22:42 static/image/common/back.gif
那你慢慢推测吧。。←_←。。。
反正我是不会哈。。→_→。。。

我先学别的,咱们等会的人答,嘻嘻{:7_181:}

牡丹花下死做鬼 发表于 2014-4-9 15:39:51

最右边的( char **,char **) 说明这是个函数形参是两个char型的二级指针
左边的(*(char**(*) (char **,char **) ) 0 ) 是返回值
这个里面char**(*) (char **,char **) 也是个函数形参也是两个二级指针返回值是个二级指针
最外面有个*那么应该是个一级指针
具体神马的我在学校上电脑课也没仔细看我大概目测了下
是一个函数
char * XXX (char **,char **);
天知道对不对呵呵

拈花小仙 发表于 2014-4-9 16:26:40

牡丹花下死做鬼 发表于 2014-4-9 15:39 static/image/common/back.gif
最右边的( char **,char **) 说明这是个函数形参是两个char型的二级指针
左边的(*(char**(*) (char **,c ...

(*(void(*) ())0)();
这是《C Traps and Pitfalls》这本经典的书中的一个例子。没有发狂吧?下面我们就来分
析分析:
第一步:void(*) (),可以明白这是一个函数指针类型。这个函数没有参数,没有返回值。
第二步:(void(*) ())0,这是将0强制转换为函数指针类型,0是一个地址,也就是说一
个函数存在首地址为0的一段区域内。
第三步:(*(void(*) ())0),这是取0地址开始的一段内存里面的内容,其内容就是保存
在首地址为0的一段区域内的函数。
第四步:(*(void(*) ())0)(),这是函数调用。
好像还是很简单是吧,上面的例子再改写改写:
(*(char**(*) (char **,char **))0) ( char **,char **);
如果没有上面的分析,恐怕不容易把这个表达式看明白吧。不过现在应该是很简单的
一件事了。读者以为呢?

牡丹花下死做鬼 发表于 2014-4-11 16:46:56

拈花小仙 发表于 2014-4-9 16:26 static/image/common/back.gif
(*(void(*) ())0)();
这是《C Traps and Pitfalls》这本经典的书中的一个例子。没有发狂吧?下面我们就来 ...

按照他的意思我猜就是
(*(char**(*) (char **,char **))0) ( char **,char **);
char**(*)是一个函数指针类型。这个函数没有参数,返回值是二级指针。
char**(*) (char **,char **)调用这个函数
*(char**(*) (char **,char **))0 这是将0强制转换为函数指针类型,0是一个地址,也就是说一
个函数存在首地址为0的一段区域内。
(*(char**(*) (char **,char **))0) 这是取0地址开始的一段内存里面的内容,其内容就是保存
在首地址为0的一段区域内的函数。
(*(char**(*) (char **,char **))0) ( char **,char **); 函数调用

仰望天上的光 发表于 2014-4-11 20:03:58

明显题目抄错了。
分析如下:
char**(*) (char **,char **)   这是一个函数指针,为了后面分析起来简单
我们 typedef char**(* FunctionPointerType) (char **,char **);
于是:(*(char**(*) (char **,char **))0) ( char **,char **); 就简化为
(*(FunctionPointerType)0) (char **,char **);
也就是
1. 把0强制转换为FunctionPointerType(就是说这个函数代码存在于存储器地址为0的地方)
2. *(FunctionPointerType)0, 得到FunctionPointerType指向的类型(就是函数类型 char** (char **,char **))
接着
3. (*(FunctionPointerType)0)(。。。)右边的括号表示调用这个函数,右边括号里应该是实参
但实际上右边括号里不是实参,所以你题目抄错了。

仰望天上的光 发表于 2014-4-11 20:06:35

书中的课后题么?这本书应该不会犯这样的错误。。。LZ认真看看,要么你抄错了,要么中文版翻译错了
页: [1]
查看完整版本: (*(char**(*) (char **,char **))0) ( char **,char **);