标题:神奇的函数值交换函数
只看楼主
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
 问题点数:0 回复次数:10 
神奇的函数值交换函数
#include <iostream>
using namespace std;

void change(int a[])
{
    a[0] += a[1];
    a[1] = a[0]-a[1];
    a[0] -= a[1];
}

int main()
{

    int x=4,y=5;

    cout  << x <<"\t"<< y<<endl;

    change(&y);

    cout  << x <<"\t"<< y<<endl;

    return 0;
}
在VC6 的debug 模式下编译后运行能 交换x,y的值(release 模式下不正确)

神奇.JPG (27.61 KB)
搜索更多相关主题的帖子: 交换 数组 debug 模式 神奇 
2008-10-25 23:01
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
原理
x,y的定义是相连的,则他们的地址也是相连的
因此可以把他们看成是一个数组的两个元素

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-10-25 23:07
沼泽
Rank: 4
等 级:业余侠客
威 望:8
帖 子:291
专家分:228
注 册:2008-9-15
得分:0 
我的怎么在release 模式下没问题??
2008-10-26 08:57
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
回复 3# 沼泽 的帖子
用的VC6

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-10-26 11:06
沼泽
Rank: 4
等 级:业余侠客
威 望:8
帖 子:291
专家分:228
注 册:2008-9-15
得分:0 
我用的也是的
2008-10-26 18:56
gongqivictor
Rank: 1
来 自:武汉科大
等 级:新手上路
帖 子:32
专家分:0
注 册:2008-9-16
得分:0 
[bo][un]vfdff[/un] 在 2008-10-25 23:07 的发言:[/bo]

x,y的定义是相连的,则他们的地址也是相连的
因此可以把他们看成是一个数组的两个元素


不是的吧,地址不是随机分配的么?
2008-10-26 20:35
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
回复 6# gongqivictor 的帖子
<程序员求职应聘必读 >p35 这样解释的

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-10-27 00:42
nwpu063417
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:428
专家分:28
注 册:2007-5-11
得分:0 
[bo][un]gongqivictor[/un] 在 2008-10-26 20:35 的发言:[/bo]



不是的吧,地址不是随机分配的么?

这个涉及到程序在内存中是如何存放的:
在标准C中main函数的格式是int main(int argc, char *argv[])
这样在压栈的时候就先压argv,然后是argc,再压局部变量x、y
也就是这样的:(上边是低地址,下边是高地址)

y
x
argc
argv
而作为按地址传递的函数你如果传进的是y的地址,那么参数加1的地址中内容就是x的值。这也就是为什么只操作a[0]、a[1]就可以改变x、y的值了

2008-10-28 19:30
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
release 版本出现问题(VC6.0)
但是我使用release 版本出现问题
没有正确的交换

result.JPG (18.5 KB)

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-10-29 03:01
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
哇,果然他们的地址是紧紧相连的
并且确实按照如此顺序,即:(上边是低地址,下边是高地址)
y
x
argc
argv

连续地址.JPG (29.35 KB)

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-10-29 03:23



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-240608-1-1.html




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

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