《C++Primer》初学者问题

1982pc 2002-11-19 10:23:27
《C++Primer》上P283页。
void swap(int v1, int v2){
int tmp=v2;
v2=v1;
v1=tmp;
}
为什么上面的程序不能实现v1,v2的交换。(在pascal中这是可以的)
为什么把v1,v2换成指针或引用就可以完成。
希望能把底层的运行原理说明。
谢谢!
...全文
28 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
1982pc 2002-11-23
  • 打赏
  • 举报
回复
谢谢大家,我对这个问题已经明白了。
cxxer 2002-11-21
  • 打赏
  • 举报
回复
程序之所以不能完成预期的目标,是因为v1,v2不过是实参的一个副本,实际上并没有把实参传递给函数swap,当然对副本的操作,肯定不会影响到实际值的变化(交换),而如果采取指针或引用(对象的化身)传递的话,它传给函数的是一个对象的地址,而对象的地址具有唯一性,对指针进行间接操作,就会对指针所指对象产生影响。再说,引用不过是C++化了的指针而已,在具体运作上只不过更直接一些,效率是一样的,效果也是一样的。
C/C++传值是单向的,它并不会再把形参传给实参,所以只有通过指针或引用间接操作对象。
quickball 2002-11-21
  • 打赏
  • 举报
回复
在C语言中,函数参数的默认的传递方式是指传递。如果需要在某个函数内部,改变传进来的变量的之需要利用指针实现引用传递,
例如:
void swap(int *v1, int *v2){
int tmp = *v2;
*v2 = *v1;
*v1 = tmp;
}
或者利用C++中的引用,swap函数声明可以这样写:
void swap(const int &v1, const int &v2);
在定义函数时,函数体内的实现与你的那个完全以行。

我对Pascal不是很熟,不过我想它应该与BASIC语言一样,默认的是参数的引用传递。所以,在Pascal中,你的那个函数可以实现。
ilovenet 2002-11-21
  • 打赏
  • 举报
回复
C++ P 里面有好详细的说明,关于函数参数传递的问题

1.指针
2.引用(其实和指针是一回事)
3,全局变量

利普曼,建议用1,2

关于低层,其实,你只要理解指针和引用在内存中的含议就明白了
anyoshon 2002-11-21
  • 打赏
  • 举报
回复
你要明白传值是怎么实现的.只传一个拷贝到参数里面去,而不是本身.
引用就可以了.
zhengguoshan 2002-11-21
  • 打赏
  • 举报
回复
传值不能进行交换,传址则可以完成交换...
这就是函数传值与传址之间的区别...
nothing707 2002-11-20
  • 打赏
  • 举报
回复
不能,main()结束
所有的值都释放了。
Crystal_arrow 2002-11-20
  • 打赏
  • 举报
回复
这是传值得

传到函数里的只是一个复制的值,当然不关主函数的事了!

void swap(int v1, int v2){
int tmp=v2;
v2=v1;
v1=tmp;
}
这是错的!!!!

应写为
void swap(int & v1, int &v2){
int tmp=v2;
v2=v1;
v1=tmp;
}



1982pc 2002-11-20
  • 打赏
  • 举报
回复
那能不能理解为在运行时刻v1和v2交换了,但main()结束后v1和v2还是原来的值呢?
ashchan 2002-11-20
  • 打赏
  • 举报
回复
Agree with skyfine(skyfine).
1982pc 2002-11-20
  • 打赏
  • 举报
回复
谢谢各位帮助
asvaboy1980 2002-11-20
  • 打赏
  • 举报
回复
真是佩服你,书上说的这是一个典型的错误,你看书的时候要认真的看,这是个错误的例子,书上是用来说明不能这么用,要么用指针和引用,要么用值传递,再者用pair
caferd 2002-11-20
  • 打赏
  • 举报
回复
看书应该仔细一点,primer中很明白的写了,这个函数使用值传递的方法,不能进行变量的交换,如果要实现交换,应该把函数的参数设为引用或指针类型
sokoban 2002-11-20
  • 打赏
  • 举报
回复
我想你还是先看钱能的书吧!
bryan99 2002-11-19
  • 打赏
  • 举报
回复
传值不能进行交换,传址则可以完成交换...
这就是函数传值与传址之间的区别...
caizzrr 2002-11-19
  • 打赏
  • 举报
回复
按值传送是在将实参copy到函数的运行栈中,交换的是在函数的运行栈的v1与 v2,而不是实参。
用引用或指针是直接对实参进行交换。
还有在pascal也不可以实现v1,v2的实参交换,交换的是函数的运行栈的v1与v2,一旦函数返回后就会释放它们,在main()中的v1,v2并没有交换。
saner 2002-11-19
  • 打赏
  • 举报
回复
(接上面)
v2_cp = temp;
}
//......
由此可以看出,只是v1_cp,v2_cp交换了,而v1和v2根本没有交换!
saner 2002-11-19
  • 打赏
  • 举报
回复
在swap内,v1和v2实际上是实参的的副本,比如说
将v1的副本叫做v1_cp,v2的副本叫做v2_cp,
那么swap实际上是
void swap( int v1, int v2 ){
v1_cp( v1 );
v2_cp( v2 );
int temp = v1_cp;
v1_cp = v2_cp;
bugfree 2002-11-19
  • 打赏
  • 举报
回复
pass value can not switch v1, v2.
If pass reference, that can do
appletou 2002-11-19
  • 打赏
  • 举报
回复
你直接看cp吗?建议还是之前先看看钱能的那本c++,或是stan的<essential c++>,否则会很痛苦
加载更多回复(2)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧