| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1026 人关注过本帖
标题:关于指针,函数,数组的程序
只看楼主 加入收藏
tisyang
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:132
专家分:737
注 册:2011-5-7
收藏
得分:0 
回复 18楼 hanxiaokun
在普通编译下会出现所谓的从数组第一个元素开始输出的假象。
假象的成因是 copy_ptr 的参数中,source 指针要比 target 大40个字节。
这样,经过复制操作后,source 和 target 都会增大 3 * sizeof(double) = 3 * 8 = 24个字节量。
这个时候 target 会比刚开始时候的 source 指针小 40 - 24 = 16 个字节量了,16个字节量真好是两个 double 变量的大小。

主函数中调用 copy_ptr 的参数是 source[2] 和 target ,source[2] 是数组 *source* (为了与 copy_ptr 的参数 source 区别,做了修饰)的第三个元素的地址,数组 *source* 的排布是连续排布的,那么第一个元素也就是 source[0] 就会比 source[3] 小两个 double 字节量,正好就是 16 个字节!!! 所以经过复制操作后的 target (copy_ptr 中的形参)指向的正好是 数组 *source* 的第一个元素的位置, 就是 1.1 ,这个时候你再以此打印 target 开始的三个 double ,正好就是 1.1 2.2 和 3.3 了。

但是在开启了编译器优化的情况下,由于两个变量内存地址变化的原因,上述情况不能重现。

C++ 用无参数构造函数生成对象时候请勿在构造函数后添加无用的那一对括号,否则有可能会被当成函数声明而忽略,嗯,栈上构建的时候就是这样。
2011-09-09 09:20
A13433758072
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广东潮州
等 级:小飞侠
威 望:1
帖 子:1182
专家分:2784
注 册:2010-7-22
收藏
得分:0 
回复 15楼 hanxiaokun
不应该啊,要不你就把代码错了,前面代码已把,指针所指的地址移向第四个元素,输出不是复制,前面时,你已改变指针所指的值,输出时,是通过地址输出的,不存在复制…… 如果要从头输出就要…… for(i=0;i<3;i++)
        printf("%.2lf",target[i]);

一步一个脚印...............................默默地前进.....
诚邀乐于解答c菜鸟问题,的热心网友加入,  QQ群38490319
2011-09-09 09:37
快速回复:关于指针,函数,数组的程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022280 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved