当前位置:   article > 正文

关于指针交换两个变量的值_交换指针p1,p2所指向的变量。 # include void main ( )

交换指针p1,p2所指向的变量。 # include void main ( ) { int a=1,b=2,

废话不多说直接上代码:


#include<iostream>
using namespace std;
void exchange(int *p1, int *p2){
	int temp;
	temp = *p1;
	*m = *n;
	*n = temp;
}
int main(){
	int x,y;
	cin>>x>>y;
	exchange(&x,&y);
	cout<<x<<"  "<<y;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

其中完成变量交换的代码(exchange函数)一目了然,然而笔者却踩过这样的坑 代码如下:


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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

但是我单纯的认为指针嘛, 就是地址我交换地址不就行了,然而残酷的是这样并不能得偿所愿。
原因是:主函数传参时,虽然明面上是值是相同的:但这仅仅是对实参的拷贝,比方说我们传进去的是 &x ,内部可能是&_x,二者不尽然相同,而当函数调用结束,&_x这个东西自然也会随之消失 所以 此方法根本就不会对主函数的调用有什么影响(就好比在这函数内部生成了几个参数 自己玩了一会儿 在函数调用结束又消失了,根本就是自娱自乐),更别说交换其值。。

:对实参的拷贝 对实参的拷贝 对实参的拷贝 (重要的事情说三遍) 不是变量本身的地址 ,如果真的传入发是变量的地址,这种写法大概 也许 可能 未尝不对 。。。。。

void exchange(int *p1, int *p2){
	int temp;
	temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

反观这个函数 同样也会对传入的实参就行拷贝 ,不过这个就明确了变量的地址,p1表示变量x的地址,p2表示变量y的地址,该函数执行时
1:temp = p1; temp作为中间量 首先保存p1的值(即x的值);
2:*p1 = *p2; 表示把p2所指的变量(y)的值 赋给p1所指的变量;
3:*p2 = temp; 表示把temp(即p1所指的变量)赋给 p2所指的变量;

同样在函数调用结束后 形参会被销毁 但在调用该函数的时候确确实实 把 p1,p2所指变量的值给交换了呀!!!故通过这种方式就完成了值的交换

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码创新者/article/detail/63015
推荐阅读
相关标签
  

闽ICP备14008679号