c++指针形参交换什么时候影响实参
比较下面三个交换程序voidswap(int*p1,int*p2)voidswap(int*p1,int*p2)voidswap(int*p1,int*p2){int*t...
比较下面三个交换程序
void swap(int *p1,int*p2) void swap(int *p1,int *p2 ) void swap(int *p1,int *p2)
{int *temp; {int *p; {int temp;
temp=p1; p=p1; temp=*p1;
p1=p2; p1=p2; *p1=*p2;
p2=temp; p2=p1; *p2=temp;
} } }
这三个程序只有第一个最后的结果没有变化,其他在引用的时候数值都发生了交换,为什么第一个会没有变化,还有就是第二个和第三个有什么区别,第二个是不是p1,p2的的地址发生了变化,而第三个是不是p1,p2所指的a,b的值发生了变化,及main函数中p1,p2所指的值 展开
void swap(int *p1,int*p2) void swap(int *p1,int *p2 ) void swap(int *p1,int *p2)
{int *temp; {int *p; {int temp;
temp=p1; p=p1; temp=*p1;
p1=p2; p1=p2; *p1=*p2;
p2=temp; p2=p1; *p2=temp;
} } }
这三个程序只有第一个最后的结果没有变化,其他在引用的时候数值都发生了交换,为什么第一个会没有变化,还有就是第二个和第三个有什么区别,第二个是不是p1,p2的的地址发生了变化,而第三个是不是p1,p2所指的a,b的值发生了变化,及main函数中p1,p2所指的值 展开
3个回答
展开全部
你这第一个和第二个有什么不一样的么,就是把temp换成了p。
第一个和第二个都不会有变化,第三个会交换。
要理解指针和指针变量的含义,我们平时说的指针,一般指的就是指针变量。指针变量也是变量,它的值也会变化。指针变量保存的是一个内存地址。
函数调用的过程中,先要把实参复制给形参,如果参数是指针类型,那么就是把指针变量复制了过去,所以实参和形参是两个不同的指针变量,只不过是保存的内存地址是一样的。可以拿int类型来类比。相当于:int a, b; a = 100; b = a; 这里a和b是两个不同的变量,同样实参的指针变量和形参的指针变量也是两个不同的变量,修改a并不会影响b。所以第二个里面p=p1; p1=p2; p2=p1;修改的是形参的指针变量,执行完之后,实参的指针变量并没有改变指向的内容。而第三个里面就不一样了,它修改的不是指针,而是指向的内存,实参和形参指向的内存是同样的,所以实参指针变量指向的内容被修改了。
所以,理解了指针的原理和函数调用的原理就能明白这个问题了,不能简单地认为只要传递指针就能改变实参。
第一个和第二个都不会有变化,第三个会交换。
要理解指针和指针变量的含义,我们平时说的指针,一般指的就是指针变量。指针变量也是变量,它的值也会变化。指针变量保存的是一个内存地址。
函数调用的过程中,先要把实参复制给形参,如果参数是指针类型,那么就是把指针变量复制了过去,所以实参和形参是两个不同的指针变量,只不过是保存的内存地址是一样的。可以拿int类型来类比。相当于:int a, b; a = 100; b = a; 这里a和b是两个不同的变量,同样实参的指针变量和形参的指针变量也是两个不同的变量,修改a并不会影响b。所以第二个里面p=p1; p1=p2; p2=p1;修改的是形参的指针变量,执行完之后,实参的指针变量并没有改变指向的内容。而第三个里面就不一样了,它修改的不是指针,而是指向的内存,实参和形参指向的内存是同样的,所以实参指针变量指向的内容被修改了。
所以,理解了指针的原理和函数调用的原理就能明白这个问题了,不能简单地认为只要传递指针就能改变实参。
追问
void swap(int *p1,int *p2 )是被main引用的,p1=&a,p2=&b,所以不是单纯的形参变化,书上写的是第一二个会变化,而第三个不会变化。。。
追答
光看函数定义,不看调用,两个确实是一摸一样的,即使看调用的地方也不会有什么不同。
书上写的不一定是对的,其实最简单的办法是自己试一下到底会不会变化。当然我们说的也不一定是对的,请酌情相信。
2013-09-18
展开全部
C语言才要考虑这种问题,C++为了避免这种难以理解的东西而专门引入了“引用”,就是希望不要用C语言式的编程办法,搞得代码难以理解
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你写的除了第三个其他都没结果,因为它们只对形参做交换。和实参没有一点关系,实参把数据复制给形参之后,两者就没一点关系了,除非用引用,引用过后,形参即实参,对形参做什么处理,实参也会相应改变。或者用第三个方法。
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询