黑客X档案官方论坛's Archiver

wzywsk 发表于 2008-4-12 19:43

C语言高手请进

就是关于C的“值传递”的方式不太理解请高手们指导。
比如下面的程序:
swap(int a,int b)
{int temp;
temp=a;
a=b;
b=temp;}
main()
{int i=3,j=5;
swap(i,j);
printf("i=%d,j=%d",i,j);
}
运行后i和j的值换不了,这是为什么???::08:: ::08:: ::08::

_Faust 发表于 2008-4-12 21:00

I 和J的值要换的话应该把交换函数改成swap(int &a,int &b)
这样就是取地址了。区地址才能把原来的数改变,而“值传递”只是把值赋予目标变量而已,本身并没有改变。所以也就无法得到交换结果了
不知道我说的合不合理::21::

kangjiang 发表于 2008-4-12 21:39

同意楼上的观点。
应该是正解吧。。。。。

wzywsk 发表于 2008-4-12 21:45

那怕是C++才可以吧::07:: ::08::

_Faust 发表于 2008-4-12 21:47

::21:: 我用的是win TC啊。一样可以的

myw123817 发表于 2008-4-13 03:15

好像swap函数中无返回值::42::

myw123817 发表于 2008-4-13 03:45

根据楼主的代码,在主函数中输出则不调换,但在swap函数中输出则调换

wzywsk 发表于 2008-4-13 09:30

楼上说的是呀那要怎么办呢?::08:: ::08:: ::08:: ::08::

zhangfa 发表于 2008-4-20 04:06

你多看一下指针那一节吧,里面讲了很多的,比较详细了

G.Fay 发表于 2008-4-20 14:11

回复 1# 的帖子

对于搂主的问题,我想可以这样解释,主函数中的i和j分别占用一个内存地址,在调用函数以后的a和b重新分配了另两个内存地址,给ab的内存地址所在位置付值当然不会影响ij 里面的内容啦

dlxhs 发表于 2008-4-21 10:30

我也感觉到了c的精华就在这里了。对地址的操作真的很重要,比如要写驱动的时候在这方面就要了解很多了。

pchobby 发表于 2008-4-21 20:01

[quote]4楼的:
那怕是C++才可以吧 [/quote]
&属于引用,据我所知的确只有C++才支持
不过在C中你可以用指针 就是*
其实引用在本质上也是指针 只不过C++做了限制而已
因为指针在某方面很危险。。。。。。

610548422 发表于 2008-4-21 20:21

直接写个
PUSH I
PUSH J
POP I
POP J
就可以了,简单明了

G.Fay 发表于 2008-4-22 13:26

回复 12# 的帖子

12楼的,&是取地址,C可以直接用的,C支持

blueair 发表于 2008-4-25 00:31

回复 11# 的帖子

用全局变量加return 语句::18:: ::18::

willweiwei 发表于 2008-4-26 15:42

晕啊,那么简单的还要什么指针啊
你的问题就是没有弄清变量的生存其问题
改为
int swap(int a,int b)
{int temp;
temp=a;
a=b;
b=temp;
return a,b;
}
main()
{int i=3,j=5;
swap(i,j);
printf("i=%d,j=%d",i,j);
}
就可以了

因为原函数没有返回值,你输出当然是输出定义的值啊。
有返回值后
变量的值就交换了

lansedaima 发表于 2008-4-28 11:55

楼上的你自己测试了没?不要误导人啊,还是用指针的好::13::

ydzj 发表于 2008-4-28 15:49

当然要用指针了,这么精华的东西!!同意17楼鄙视16楼
前面有个老兄用&
这里有点异议
我想在定义时应该用 int swap(int *a,int *b){}
在主函数中声明 int a,b;
而在使用时用 swap(&a,&b)
这样才对吧???
说的不好
大家继续讨论

花想容 发表于 2008-4-30 16:53

LZ的问题很简单`````是局部的问题,    C++有局部变量和全局变量之分````涉及到栈的问题,,程序在调用一个函数,会把函数的变量PUSH进去```函数返回的时候```栈被清空   ,
如果还不理解请
LZ请看下面分析

swap(int a,int b)
{int temp;
temp=a;     //在这个函数里定义的变量  a 和b 在swap作用域内  也就是{和}之间```也就是说
a=b;           //变量a  b的值在这个函数里确实是交换了```但是函数返回后,,a b又被清空```因
b=temp;}     //为作用域变了````所以在main函数里,看不到a  b被交换..~!   要想真正的交换a b
main()         //  可以使用指针和引用的方法```这里不列举了
{int i=3,j=5;
swap(i,j);
printf("i=%d,j=%d",i,j);
}

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.