swap函數 进阶探讨与实现
来源:互联网 发布:抽数字软件 编辑:程序博客网 时间:2024/06/03 11:34
相信下面這個C程序很多人都見過啦,當時自己看 美少女战士谭浩强 写的那本书上的解释,反正我当时是没看太懂具体是什么意思,谱架啊~~~
#include <stdio.h>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 <stdio.h>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 <stdio.h>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 <stdio.h>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 <stdio.h>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, 如果想好好理解一下的話,自己推導一下就可以了,挺簡單的~~
0 0
- swap函數 进阶探讨与实现
- C語言 rand函数 进阶探讨与实现
- 探讨继承与实现
- 数据结构与算法day1--swap的实现
- jQuery选择器探讨进阶
- Java各种排序算法实现与探讨
- Java金融货币计算探讨与实现
- iPhone消息推送机制实现与探讨
- iPhone消息推送机制实现与探讨
- iPhone消息推送机制实现与探讨
- iPhone消息推送机制实现与探讨
- iPhone消息推送机制实现与探讨
- iPhone消息推送机制实现与探讨
- iPhone消息推送机制实现与探讨
- iPhone消息推送机制实现与探讨
- iPhone消息推送机制实现与探讨
- iPhone消息推送机制实现与探讨
- iPhone消息推送机制实现与探讨
- 为什么不需要在 Docker 容器中运行 sshd
- 将真分数分解为埃及分数
- iptables禁止某个mac地址上网
- 白话经典算法系列之三 希尔排序的实现
- 三个数求最大数、最小数、中间数
- swap函數 进阶探讨与实现
- 指数族和广义线性模型(The exponential family and Generalized Linear Models)
- 《深入理解java虚拟机》自动装箱拆箱实例
- 学习使用iReport几点总结
- 数据结构题集(严蔚敏版)题目——第二章 线性表
- 黑马程序员——3、C语言(数组和指针)
- Probabilistic Context-Free Grammar
- HDU4882ZCC Loves Codefires(贪心)
- 蓝牙系列之android4.2:整体框架分析(a2dp socket/hfp socket)为例