两个交换函数

metaphy 2010-01-04 02:11:07
#include <iostream>
using namespace std;

void swapp(int &m, int &n) {
int tmp = m;
m = n;
n = tmp;
}

void swapq(int *p, int *q) {
int tmp = *p;
*p = *q;
*q = tmp;
}

int main() {
int m = 0;
int n = 1;
cout << "m = " << m << "; n = " << n << endl;
swapp(m, n);
cout << "m = " << m << "; n = " << n << endl;
swapq(&m, &n);
cout << "m = " << m << "; n = " << n << endl;
}


Both functions work, 但太难理解了。先看第一个swapp. 这个调用的时候,是传变量m,n,函数接收的却是m,n的引用,因此做交换的时候,就是把原main函数里面的m,n的值改掉了,这是传引用的函数调用。

再看第二个,调用的时候直接传变量m,n的地址,函数原型接收m,n的地址,并把它们保存在*p,*q 2个指针变量里面,然后是2个指针变量的交换,比较难理解的是,明明是2个指针交换,为什么回到main函数后,编程m、n交换了?
...全文
181 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wesleyluo 2010-01-04
  • 打赏
  • 举报
回复
'&'是表示取地址;
'*'是表示取值或是指针;
第一个void swapp(int &m, int &n)是传入m,n并且取了他们的地址进行操作,所以交换了。
第二个void swapq(int *p, int *q)是传入m,n的地址,对地址进行操作,数据是存在所指向的地址中的,如果地址交换了,值也就交换了。

是这么理解吗?
jasion_chen 2010-01-04
  • 打赏
  • 举报
回复
楼主可以看看函数传值和传址的区别
metaphy 2010-01-04
  • 打赏
  • 举报
回复
Thanks,明白了,结贴。

其实这句 int tmp = *p; 就说明问题了。
还有,如果指针交换的话,应该是 p 和 q的交换,而不是*p, *q交换。

selooloo 2010-01-04
  • 打赏
  • 举报
回复
第二个可不是指针交换,是值交换
pur_e 2010-01-04
  • 打赏
  • 举报
回复
你不知道*的含义吗,*p表示的是p指针指向的数据,不是指针本身的数据,交换的是*p和*q,就是p和q指针指向的数据,也就是main中的m和n
james_hw 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 metaphy 的回复:]
#include <iostream>
using namespace std;

void swapp(int &m, int &n) {
int tmp = m;
m = n;
n = tmp;
}

void swapq(int *p, int *q) {
int tmp = *p;
*p = *q;
*q = tmp;
}

int main() {
int m = 0;
int n = 1;
cout < < "m = " < < m < < "; n = " < < n < < endl;
swapp(m, n);
cout < < "m = " < < m < < "; n = " < < n < < endl;
swapq(&m, &n);
cout < < "m = " < < m < < "; n = " < < n < < endl;
}


Both functions work, 但太难理解了。先看第一个swapp. 这个调用的时候,是传变量m,n,函数接收的却是m,n的引用,因此做交换的时候,就是把原main函数里面的m,n的值改掉了,这是传引用的函数调用。

再看第二个,调用的时候直接传变量m,n的地址,函数原型接收m,n的地址,并把它们保存在*p,*q 2个指针变量里面,然后是2个指针变量的交换,比较难理解的是,明明是2个指针交换,为什么回到main函数后,编程m、n交换了?

[/Quote]

不是两个指针的交换,是两个指针保存的值进行了交换。

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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