鱼C论坛

 找回密码
 立即注册
查看: 2735|回复: 19

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

[复制链接]
发表于 2014-4-8 18:04:50 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 拈花小仙 于 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 **);//书中的例子,这个帮我分析下,谢谢!



最佳答案

查看完整内容

呵呵,刚才没看到你的回复,前面分析得对,最后一步分析错了,调用函数,最右边括号里必是实参
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-8 18:04:51 | 显示全部楼层

呵呵,刚才没看到你的回复,前面分析得对,最后一步分析错了,调用函数,最右边括号里必是实参
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-8 19:02:48 | 显示全部楼层
ginger77 发表于 2014-4-8 18:29
等大神来回答  学习学习

如果不会最好别回复,因为大神看到有人回复了,就不来回复了,咱们就学不到东西了{:7_181:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-8 19:14:05 | 显示全部楼层
ginger77 发表于 2014-4-8 19:06
抱歉
不过问题还没解决 会有人来回的

没关系,还很多未解决的呢,开时高手以为有人回复了就不看了,最后沉了下去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-8 19:22:59 | 显示全部楼层
ginger77 发表于 2014-4-8 19:19
索哒斯勒。。。

他们一般不会看回复很多次的,因为他们会误以为提问者这么多答案都不采纳,可能是不怎么上论坛了,可能是都不满意很苛刻,一般都不会看的,没事哦,我只是开个玩笑,嘻{:7_174:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-8 19:36:24 | 显示全部楼层
ginger77 发表于 2014-4-8 19:26
嗯 跟您这里也学到东西了
看得出来您很好学的

{:7_166:}我很好问,嘻嘻
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-8 19:44:46 | 显示全部楼层
ginger77 发表于 2014-4-8 19:40
不过,跟“好问"的意思也差不多啦

学东西就是要 不耻下问 嘛

{:7_158:}嘻嘻,谢谢哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-8 21:18:29 | 显示全部楼层
我擦。。。我还以为有人回复了呢? 10多条回复。。。。结果。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-8 21:22:38 | 显示全部楼层
解析如下。。。。
(                  *(          char**(*) (char **,char **)      )0          )        ( char **,char **);
额。。。好吧。。。我不懂。。。我擦。。。。。这他妈是啥渣渣书啊?
SB么。。。出这种蛋疼的。。东东。。。。。。考智商啊。。。
顺便说一下。。。你确定是这样?。。上下文没什么交代。。。不对啊。。总感觉。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-8 21:33:30 | 显示全部楼层
向往青莲 发表于 2014-4-8 21:22
解析如下。。。。
(                  *(          char**(*) (char **,char **)      )0          )      ...

上面还有个题没看懂,下面是考题,更不懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-8 21:34:50 | 显示全部楼层
向往青莲 发表于 2014-4-8 21:22
解析如下。。。。
(                  *(          char**(*) (char **,char **)      )0          )      ...

C语言深度解析书上的题,目地不是为了有用,只是考大家对指针的理解,能分清优先级,通过优先级和指针的一些基础来判断,也就是通过一些对指针的掌握来推断,可是我指针学的很差
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-8 21:41:07 | 显示全部楼层
不必要的。。。我指针以前也掌握的不是很棒。。。。但是在使用的过程中。。。慢慢就会好一点的。。。。
重点在实践。。。这种书。。浏览一遍就行了。。。。。。。。ps:(没有人会写这种代码徳。。。如果今天写了。。明天就丢饭碗了。。)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-8 22:08:03 | 显示全部楼层
向往青莲 发表于 2014-4-8 21:41
不必要的。。。我指针以前也掌握的不是很棒。。。。但是在使用的过程中。。。慢慢就会好一点的。。。。
重 ...

{:7_181:}这题的目地不是教这么写,而是通过对鼠标的理解来推测出这个的用法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-8 22:42:49 | 显示全部楼层
拈花小仙 发表于 2014-4-8 22:08
这题的目地不是教这么写,而是通过对鼠标的理解来推测出这个的用法

那你慢慢推测吧。。←_←。。。
反正我是不会哈。。→_→。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-8 22:52:18 | 显示全部楼层
向往青莲 发表于 2014-4-8 22:42
那你慢慢推测吧。。←_←。。。
反正我是不会哈。。→_→。。。

我先学别的,咱们等会的人答,嘻嘻{:7_181:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-9 15:39:51 | 显示全部楼层
最右边的( char **,char **) 说明这是个函数形参是两个char型的二级指针
左边的(  *(char**(*) (char **,char **) ) 0 ) 是返回值
这个里面char**(*) (char **,char **) 也是个函数形参也是两个二级指针返回值是个二级指针
最外面有个*那么应该是个一级指针
具体神马的我在学校上电脑课也没仔细看我大概目测了下
是一个函数  
char * XXX (char **,char **);
天知道对不对  呵呵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-9 16:26:40 | 显示全部楼层
牡丹花下死做鬼 发表于 2014-4-9 15:39
最右边的( 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 **);
如果没有上面的分析,恐怕不容易把这个表达式看明白吧。不过现在应该是很简单的
一件事了。读者以为呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-11 16:46:56 | 显示全部楼层
拈花小仙 发表于 2014-4-9 16:26
(*(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 **); 函数调用

评分

参与人数 1鱼币 +5 收起 理由
拈花小仙 + 5 谢谢牡丹

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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)(。。。)右边的括号表示调用这个函数,右边括号里应该是实参
但实际上右边括号里不是实参,所以你题目抄错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-11 20:06:35 | 显示全部楼层
书中的课后题么?这本书应该不会犯这样的错误。。。LZ认真看看,要么你抄错了,要么中文版翻译错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 02:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表