这段C++程序为什么不能交换两个变量的值??
#include<iostream>usingnamespacestd;voidswap(int*,int*);intmain(void){inta=100,b=200,...
#include <iostream>
using namespace std;
void swap(int *, int *);
int main(void)
{
int a = 100, b = 200, *p1, *p2;
p1 = &a;
p2 = &b;
swap(p1, p2);
cout << *p1 << " " << *p2 << endl;
return 0;
}
void swap(int *x, int *y)
{
int *t;
t = x;
x = y;
y = t;
}
正确的函数内交换方法我知道。。。既然指针可以在调用函数内保留地址,为什么在SWAP函数内如上写法就还是不能交换呢?费解~~~~~~~~(我知道如果省略这个函数的内容而直接写在MAIN中可以顺利实现)我就是想知道这个错误的详细原因解释。。谢谢各位。 展开
using namespace std;
void swap(int *, int *);
int main(void)
{
int a = 100, b = 200, *p1, *p2;
p1 = &a;
p2 = &b;
swap(p1, p2);
cout << *p1 << " " << *p2 << endl;
return 0;
}
void swap(int *x, int *y)
{
int *t;
t = x;
x = y;
y = t;
}
正确的函数内交换方法我知道。。。既然指针可以在调用函数内保留地址,为什么在SWAP函数内如上写法就还是不能交换呢?费解~~~~~~~~(我知道如果省略这个函数的内容而直接写在MAIN中可以顺利实现)我就是想知道这个错误的详细原因解释。。谢谢各位。 展开
4个回答
展开全部
void swap(int *x, int *y) // 给定2个整型指针,交换其内容
{
int *t; // 临时指针
t = x; // 这里只是将指针进行赋值,而不牵扯到指针指向的内容
x = y;
y = t; // 执行结束后, x,y,t三个指针将指向同一空间
}
比如主函数中,
a的值是100,a的地址是0x11223344;
b的值是200,b的地址是0x44332211;
那么我们调用swap的时候:
x的值是0x11223344,y的值是0x44332211;
t的值初始化为0x11223344(与x相同);
执行x=y;y=t;之后,x的值为0x44332211;
y,t两者的值都为0x11223344。
也就是说,此时x所指向的内容为200,y指向的内容为100。
看到这里你可能要问,两个数貌似是被换了的,但是为什么主函数中没有被换?
其实,当p1和p2被传递给swap的时候,传递过去的只是指针变量的副本(注意,是指针本身,而不是指针指向的内容)。如果不改变swap的内容的话,我们就需要将x和y声明为指针引用,如下:
void swap(int* &x, int* &y)
{ …… }
问题:
正确的函数内交换方法我知道。。。既然指针可以在调用函数内保留地址,为什么在SWAP函数内如上写法就还是不能交换呢?费解~~~~~~~~
答:
请参看相关书籍的“引用”及“指针引用”章节。
{
int *t; // 临时指针
t = x; // 这里只是将指针进行赋值,而不牵扯到指针指向的内容
x = y;
y = t; // 执行结束后, x,y,t三个指针将指向同一空间
}
比如主函数中,
a的值是100,a的地址是0x11223344;
b的值是200,b的地址是0x44332211;
那么我们调用swap的时候:
x的值是0x11223344,y的值是0x44332211;
t的值初始化为0x11223344(与x相同);
执行x=y;y=t;之后,x的值为0x44332211;
y,t两者的值都为0x11223344。
也就是说,此时x所指向的内容为200,y指向的内容为100。
看到这里你可能要问,两个数貌似是被换了的,但是为什么主函数中没有被换?
其实,当p1和p2被传递给swap的时候,传递过去的只是指针变量的副本(注意,是指针本身,而不是指针指向的内容)。如果不改变swap的内容的话,我们就需要将x和y声明为指针引用,如下:
void swap(int* &x, int* &y)
{ …… }
问题:
正确的函数内交换方法我知道。。。既然指针可以在调用函数内保留地址,为什么在SWAP函数内如上写法就还是不能交换呢?费解~~~~~~~~
答:
请参看相关书籍的“引用”及“指针引用”章节。
展开全部
专门把谭浩强的《C程序设计》翻出来。原文是这么写的:不能企图通过改变指针形参的值而值指针实参的值改变。C语言中实参变量的形参变量之间的数据传递是单向的“值传递”方式。指针变量作函数参数也遵循这一规则,调用函数不可能改变实参指针变量的值,但可以改变实参指针变量 所指变量 的值。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为指针传递也属于值传递。
#include <iostream>
using namespace std;
void swap(int *, int *);
int main()
{
int a=100, b=200, *p1, *p2;
p1 = &a;
p2 = &b;
swap(p1,p2);
cout << *p1 << " " << *p2 << endl;
cout<<a<<b;
return 0;
}
void swap(int *x, int *y)
{
int t;
t = *x;
*x = *y;
*y = t;
}
把程序改成我这样就可以了,还是你定义的函数的问题。问题的原因主要在于,你在swap函数中两个参数其实是通过形参交换的地址值只是在形参中变化,并没有影响到实参的变化。所以你应该写成
int t;
t = *x;
*x = *y;
*y = t; 才可以。
#include <iostream>
using namespace std;
void swap(int *, int *);
int main()
{
int a=100, b=200, *p1, *p2;
p1 = &a;
p2 = &b;
swap(p1,p2);
cout << *p1 << " " << *p2 << endl;
cout<<a<<b;
return 0;
}
void swap(int *x, int *y)
{
int t;
t = *x;
*x = *y;
*y = t;
}
把程序改成我这样就可以了,还是你定义的函数的问题。问题的原因主要在于,你在swap函数中两个参数其实是通过形参交换的地址值只是在形参中变化,并没有影响到实参的变化。所以你应该写成
int t;
t = *x;
*x = *y;
*y = t; 才可以。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
传递的是参数是内存地址,用你的方法在子函数中对调地址,但是本来p1,p2地址所对应的数值没有变。
要改变地址所对应的数才行
void swap(int *x, int *y)
{
int t;
t = *x;
*x = *y;
*y = t;
}
要改变地址所对应的数才行
void swap(int *x, int *y)
{
int t;
t = *x;
*x = *y;
*y = t;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询