赞
踩
废话不多说直接上代码:
#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;
}
其中完成变量交换的代码(exchange函数)一目了然,然而笔者却踩过这样的坑 代码如下:
void exchange(int *p1, int *p2){
int *temp;
temp = p1;
p1 = p2;
p2 = temp;
}
但是我单纯的认为指针嘛, 就是地址我交换地址不就行了,然而残酷的是这样并不能得偿所愿。
原因是:主函数传参时,虽然明面上是值是相同的:但这仅仅是对实参的拷贝,比方说我们传进去的是 &x ,内部可能是&_x,二者不尽然相同,而当函数调用结束,&_x这个东西自然也会随之消失 所以 此方法根本就不会对主函数的调用有什么影响(就好比在这函数内部生成了几个参数 自己玩了一会儿 在函数调用结束又消失了,根本就是自娱自乐),更别说交换其值。。
注:对实参的拷贝 对实参的拷贝 对实参的拷贝 (重要的事情说三遍) 不是变量本身的地址 ,如果真的传入发是变量的地址,这种写法大概 也许 可能 未尝不对 。。。。。
void exchange(int *p1, int *p2){
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
反观这个函数 同样也会对传入的实参就行拷贝 ,不过这个就明确了变量的地址,p1表示变量x的地址,p2表示变量y的地址,该函数执行时
1:temp = p1; temp作为中间量 首先保存p1的值(即x的值);
2:*p1 = *p2; 表示把p2所指的变量(y)的值 赋给p1所指的变量;
3:*p2 = temp; 表示把temp(即p1所指的变量)赋给 p2所指的变量;
同样在函数调用结束后 形参会被销毁 但在调用该函数的时候确确实实 把 p1,p2所指变量的值给交换了呀!!!故通过这种方式就完成了值的交换
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。