为啥地址传递后还是不能改变值?

zaixiankaifa 2012-06-06 11:38:07
#include <iostream>
using namespace std;
int main(){
void swap(int *p1,int *p2);
int *pointer_1,*pointer_2,a,b;
cin>>a>>b;
pointer_1=&a;
pointer_2=&b;
if(a<b)swap(pointer_1,pointer_2);
cout<<"max="<<a<<"min="<<b<<endl;
return 0;
}
void swap(int *p1,int *p2)
{
int *temp;
temp=p1;
p1=p2;
p2=temp;
}




在谭浩强的那本经典教材《C++程序设计》里面看到上面这个程序,说是用地址传递去改变值,但是使用地址传递之后,还是不能改变,为啥呢?
另外,书中有两句话不明白:1.实参变量与形参变量之间的数据传递是单向的“值传递”方式,指针变量作为函数参数也要这一规则。
2.调用函数时不会改变实参指针变量的值,但可以改变实参指针变量所指向变量的值。(不是说,只是改变指针所指向的变量吗,怎么可以把指向的变量的值也可以修改了? 应该是改变所指的变量呀,而不是改变所指向的值)

...全文
455 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
UpCokio 2012-06-07
  • 打赏
  • 举报
回复
学c语言的飘过。。。关于你的程序我就不看了。。。
就说说 那两句话没错。
1.值传递 是 单项传递。。对指针来说传递的值是地址。
2.形参得到 传递的 地址 然后改变地址 中的 值 ,这个值对于这个函数确切的属于外部变量。

对地址中的值操作完后 ,值不变,形参空间释放 ,不能传递给实参。
pathuang68 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
#include <iostream>
using namespace std;
int main(){
void swap(int *p1,int *p2);
int *pointer_1,*pointer_2,a,b;
cin>>a>>b;
pointer_1=&a;
pointer_2=&b;
if(a<b)swap(pointer_1,pointer_2);……
[/Quote]

谭老道的下面那两句没有错,只是对初学者有点晦涩难懂了。
1.实参变量与形参变量之间的数据传递是单向的“值传递”方式,指针变量作为函数参数也要这一规则。
2. 调用函数时不会改变实参指针变量的值,但可以改变实参指针变量所指向变量的值。

楼主首先得明白什么事“值传递”,所谓值传递就是传入到函数内部的不是实参本身,而是实参的一个拷贝(副本),实参本身是不会有任何改变的,这就是为什么谭老道所谓的“单向”的含义。

void swap(int *p1,int *p2) // 实参是p1和p2
{
int *temp;
temp=p1; // 在函数内部的p1和p2,是实参p1和p2的副本,仅在函数体内有效。
p1=p2; // 你在这里再怎么改变p1和p2,一离开函数,原来的实参不会发生任何改变
p2=temp; // 正是因为这个原因,不能用过改变指向来达到交换的目的,而是要通过
} // 改变p1和p2所指向的值,来达到交换的母的


正确的写法:

void swap(int *p1,int *p2)
{
int temp;
temp = *p1; // 在这里p1和p2本身没有发生改变,但他们所指向的值发生了改变
*p1 = *p2;
*p2 = temp;
}
celltree001 2012-06-07
  • 打赏
  • 举报
回复
void swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
wizard_tiger 2012-06-07
  • 打赏
  • 举报
回复
LS都说了,学习一下!
赵4老师 2012-06-07
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

不要写连自己也预测不了结果的代码!
Athenacle_ 2012-06-06
  • 打赏
  • 举报
回复

void swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}

  • 打赏
  • 举报
回复
1.指针传递的也只是 指针的本身的值 (也就是 指针所指向的地址)
2.第二个 通俗的说法来说 改变指针所指向的 值 就是 改变 所指向的变量的值。 这种说法语法上不严谨。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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