博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
swap函數 进阶探讨与实现
阅读量:7078 次
发布时间:2019-06-28

本文共 2209 字,大约阅读时间需要 7 分钟。

相信以下這個C程序非常多人都見過啦。當時自己看 美少女战士谭浩强 写的那本书上的解释。反正我当时是没看太懂详细是什么意思。谱架啊~~~

#include 
void swap(int x, int y){ int temp = x; x = y; y = temp;}int main(){ int n, m; while(~scanf("%d %d", &n, &m)) { swap(n, m); printf("%d <--> %d\n", n, m); } return 0;}
看结果。这个swap函数是一点用都没有啦,所以嘞,下面的程序就是帮助理解滴:

#include 
void swap(int x, int y){ printf("The formal parameter X's address : %d\n", &x); printf("The formal parameter Y's address : %d\n", &y); printf("--------------------------------------------\n"); int temp = x; x = y; y = temp; printf("The formal parameter X's address : %d\n", &x); printf("The formal parameter Y's address : %d\n", &y); printf("--------------------------------------------\n");}int main(){ int n, m; while(~scanf("%d %d", &n, &m)) { printf("The actual parameter N's address : %d\n", &n); //呢个actual 同埋formal系实參,形參唧意思。 printf("The actual parameter M's address : %d\n", &m); printf("--------------------------------------------\n"); swap(n, m); printf("%d <--> %d\n", n, m); } return 0;}
执行结果:

从执行结果能够看到实參与形參的地址是不一样滴。所以。你改变形參内存地址存储的值不会影响到实參内存地址中存储的值。 实參与形參的结合仅仅是值传递。而不是地址传递。

所以从这个“实參向形參传递地址”这个思路其中能够实现swap函数的功能:

#include 
void swap(int *x, int *y) { int temp = *x; *x = *y; *y = temp;}int main(){ int n, m; while(~scanf("%d %d", &n, &m)) { swap(&n, &m); //传递的是地址,所以形参與实参相应共用同一段地址。 printf("%d <--> %d\n", n, m); } return 0;}

或者用第二种思路啦,“引用”,引用变量是已定义的变量的别名,它与这个变量共同指向同一段地址,它会随着引用变量值的改变而改变;

#include 
void swap(int &x, int &y){ int temp = x; x = y; y = temp;}int main(){ int n, m; while(~scanf("%d %d", &n, &m)) { swap(n, m); printf("%d <--> %d\n", n, m); } return 0;}

悄悄告訴你,還有一種方法啦,哈哈:

#include 
int swap(int &a, int &b){ a = a ^ b; b = a ^ b; a = a ^ b;}int main(){ int n, m; while(~scanf("%d %d", &n, &m)) { swap(n, m); printf("%d <--> %d\n", n, m); } return 0;}

或者:

void swap(int *x, int *y){    *y = *x ^ *y;    *x = *x ^ *y;    *y = *x ^ *y;}
這個是運用到了二進制邏輯運算 + 每個元素的加法逆元 a ^ a = 0, 假设想好好理解一下的話,自己推導一下就能够了,挺簡單的~~

你可能感兴趣的文章
技术负责人所需的四个核心能力,你具备几个?
查看>>
Kotlin 开发者社区
查看>>
【对讲机的那点事】带你玩转宝锋UV6R对讲机(二)
查看>>
Spring使用表单上传文件
查看>>
hcatalog简介和使用
查看>>
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 11 章 索引_11.12. 检查索引使用
查看>>
给容器服务的APIServer开放IPv6的访问
查看>>
REGEXP_EXTRACT
查看>>
购物网站常见的展示商品的div
查看>>
iOS开发~CocoaPods使用详细说明
查看>>
Confluence 6 使用 CSS 样式化 Confluence 的介绍
查看>>
Go 语言开源发布 9 周年!社区贡献指数创新高
查看>>
MySQL中的账号与权限管理
查看>>
Java原生实现定时器
查看>>
【我们一起写框架】MVVM的WPF框架(三)—数据控件
查看>>
Confluence 6 导入模板的定义
查看>>
java中迭代器的原理图解和源码浅析
查看>>
EditPlus如何设置保存时不产生.bak备份文件?
查看>>
机器学习到底是什么?
查看>>
phpstorm配置svn
查看>>