免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: baozhao
打印 上一主题 下一主题

[C] 指针与地址 (关于标准ISO/IEC 9899:1999(E)的一些问题) [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-05-29 16:21 |只看该作者
int main()
{
        int *pi;
        int a;
        pi = &a;
}


08048344 <main>:
8048344:       8d 4c 24 04             lea    0x4(%esp),%ecx
8048348:       83 e4 f0                and    $0xfffffff0,%esp
804834b:       ff 71 fc                pushl  -0x4(%ecx)
804834e:       55                      push   %ebp
804834f:       89 e5                   mov    %esp,%ebp
8048351:       51                      push   %ecx
8048352:       83 ec 10                sub    $0x10,%esp
8048355:       8d 45 f4                lea    -0xc(%ebp),%eax
8048358:       89 45 f8                mov    %eax,-0x8(%ebp)
804835b:       83 c4 10                add    $0x10,%esp
804835e:       59                      pop    %ecx
804835f:       5d                      pop    %ebp
8048360:       8d 61 fc                lea    -0x4(%ecx),%esp

我汇编都忘的差不多了,
lea    -0xc(%ebp),%eax
mov    %eax,-0x8(%ebp)
基本上就应该对应pi = &a;

LZ有点钻牛角尖了


原帖由 baozhao 于 2008-5-29 16:06 发表


把&a是否是常量的问题先搁在一边。

5是整数,也有值,但5不是object。 (我所知道的object都是需要空间的,而不是类似汇编中的立即数直接嵌入指令中)

所以,整个问题的关键是object该做何解?

[ 本帖最后由 ypxing 于 2008-5-29 16:29 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2008-05-29 16:33 |只看该作者
LZ有点钻牛角尖了


呵呵,不好意思,我确实想知道标准该如何解释,所以可能是钻牛角尖了。

非常感谢你把反汇编也帖出来,但是这也不能解释object啊?

论坛徽章:
0
13 [报告]
发表于 2008-05-29 16:38 |只看该作者
贴出汇编代码是想告诉你,
你所认识的"object都是需要空间的"在这里是不适用的,估计很多其他地方也不适用。

你如果一直有这种想法的话,估计你会一直很郁闷

原帖由 baozhao 于 2008-5-29 16:33 发表


呵呵,不好意思,我确实想知道标准该如何解释,所以可能是钻牛角尖了。

非常感谢你把反汇编也帖出来,但是这也不能解释object啊?

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
14 [报告]
发表于 2008-05-29 16:48 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
15 [报告]
发表于 2008-05-29 16:51 |只看该作者

回复 #12 ypxing 的帖子

C的各种语法结构怎么转换成汇编也我也是懂一点点的,两个变量都在stack上分配了空间(它们都是object),但是&a没有。
     不知道我是否可以认为你承认&a是object。

论坛徽章:
0
16 [报告]
发表于 2008-05-29 16:54 |只看该作者

回复 #13 c/unix 的帖子

dear c/unix,
why not tell me what is a right view?

for example, you can tell me  &a is a object

论坛徽章:
0
17 [报告]
发表于 2008-05-29 16:56 |只看该作者
从汇编代码应该看到,给&a分配存储空间实在是没有必要
编译器不可能因为标准说他是object,就要给他分配空间呀,
这两者之间没有因果关系

原帖由 baozhao 于 2008-5-29 16:51 发表
C的各种语法结构怎么转换成汇编也我也是懂一点点的,两个变量都在stack上分配了空间(它们都是object),但是&a没有。
     不知道我是否可以认为你承认&a是object。

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
18 [报告]
发表于 2008-05-29 17:01 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
19 [报告]
发表于 2008-05-29 17:02 |只看该作者
原帖由 ypxing 于 2008-5-29 16:56 发表
从汇编代码应该看到,给&a分配存储空间实在是没有必要
编译器不可能因为标准说他是object,就要给他分配空间呀,
这两者之间没有因果关系


你说的完全正确。编译器实现不能代表标准。

但是我这里不是说编译器的实现,而是我们怎样理解标准。

我理解的C标准是 &a 不是对象,请问你理解的标准&a是不是对象呢?

论坛徽章:
0
20 [报告]
发表于 2008-05-29 17:09 |只看该作者

回复 #18 baozhao 的帖子

说实话,我从来没有太注意object这个词
我只注意,它是一种类型,有自己的sizeof,有自己的操作方式
通过它可以访问别人。

我认为,LZ这个地方不需要细扣了,不影响理解和使用的。

题外话,这里object和C++中的object的含义肯定不同,
C标准的作者也可能只是随便用了这个词,这可能是所谓的
说者无意,听者有心
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP