社区
C语言
帖子详情
《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
打赏
收藏
《C++Primer》初学者问题
《C++Primer》上P283页。 void swap(int v1, int v2){ int tmp=v2; v2=v1; v1=tmp; } 为什么上面的程序不能实现v1,v2的交换。(在pascal中这是可以的) 为什么把v1,v2换成指针或引用就可以完成。 希望能把底层的运行原理说明。 谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
c++
primer
初学者
参考书籍
c++
primer
适合
初学者
学习了解,内容详细明了,可以跟着敲一些代码学习
c++
primer
高清中文版-第5版.zip
C++
是一门强大、难学、令人痛苦,但又是如此美妙的编程语言,在工业界和学术界都可以使用,《
C++
Primer
(第5版)》即针对
初学者
,也同样适用于有一定编程经验的读者,第5版配备了
C++
11新标准,是
C++
粉丝们书架上...
C++
语言基础视频教程
C++
语言基础视频培训课程:本课与主讲者在大学开出的程序设计课程直接对接,准确把握知识点,注重教学视频与实践体系的结合,帮助
初学者
有效学习。本教程详细介绍
C++
语言中的封装、数据隐藏、继承、多态的实现等入门...
C++
primer
第五版,英文版
锻炼自己的全英文
C++
primer
第五版电子版,更加适合于有一定代码功底人士阅读,
初学者
(你要读也很棒棒)阅读难度较大。
C++
Primer
习题集第五版 pdf
习题集 【中图法分类号】TP312-44 【内容提要】
C++
Primer
(FifthEdition)由三位
C++
大师StanleyB.Lippman、JoséeLajoie和BarbaraE.Moo合作完成,其中文译本《
C++
Primer
中文版(第5版)》也已出版。与上一版相比,本书...
C语言
69,336
社区成员
243,078
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章