swap函數 进阶探讨与实现
相信以下這個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, 假设想好好理解一下的話,自己推導一下就能够了,挺簡單的~~
swap函數 进阶探讨与实现的更多相关文章
- oracle decode(nvl(estimate_qty,0),0,1,estimate_qty) 函數
oracle decode(nvl(estimate_qty,0),0,1,estimate_qty) 函數
- js匿名函數
(function($){})(jquery) == (function($){})(jQuery) 实际上是匿名函数 用于存放开发插件的代码 作用(非常有用): 这种写法的最大好处是形成闭包.在(f ...
- Math.Round函數
Math.Round這個函數的解釋是將值按指定的小數位數舍入,但並不就是四捨五入.這種舍入有時稱為就近舍入或四舍六入五成雙 其實在 VB, VBScript, C#, J#, T-SQL 中 Roun ...
- C#判断奇偶数的函數
// 现代流行的"程序员" public static bool IsOdd(int n) { while (true) { switch (n) { : return true; ...
- PHP 計算字符串長度函數
PHP內置的字符串長度函數strlen無法正確處理中文字符串,它得到的只是字符串所占的字節數.對於GB2312的中文編碼,strlen得到的值是漢字個數的2倍,而對於UTF-8編碼的中文,就是3倍的差 ...
- SQL窗体函數一例
需求: MSSQL,列出服務實例中全部數據庫的例如以下信息: 數據庫ID.數據庫名.創建日期.數據文件類型.數據文件大小.數據庫總大小.文件所在路徑. 寫法(後面的百分比為所花時間占比): -- 连接 ...
- js函數
函數是什麼?函數就是被事件驅動或者調用執行的可重複的代碼塊. 函數聲明: 使用關鍵詞function,關鍵詞function大小敏感. function a{代碼塊} 局部變量: 在函數內部聲明的變量 ...
- concat函數 函數concat 可以用來合拼兩個或以上的字串。
12. “Mexico 墨西哥”的首都是”Mexico City”. 顯示所有國家名字,其首都是國家名字加上”City”. concat函數 函數concat 可以用來合拼兩個或以上的字串. : SE ...
- (C/C++) 指向函數的指標
最近再跟指標做朋友, 正好遇到函數與指標. 其實函數也在程式內也是有屬於自己的位址 所以指標一樣能指向函數, 在此釐清自己的觀念以及記錄下來. #include <stdio.h> #in ...
随机推荐
- Flow Problem(最大流)
Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- Lucene 实例教程(二)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui031 ...
- Linux常用命令 新手必看
文件和目录cd /home 进入 '/ home' 目录'cd .. 返回上一级目录cd ../.. 返回上两级目录cd 进入个人的主目录cd ~user1 进入个人的主目录cd - 返回上次所在的目 ...
- 一天一个类--NIO 之Buffer
java.nio --- 定义了 Buffer 及其数据类型相关的子类.其中被 java.nio.channels 中的类用来进行 IO 操作的 ByteBuffer 的作用非常重要. java.n ...
- 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径
自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...
- POJ 1142 质因数分解
只要很朴素的分解就可以了,数据量不大 #include <stdio.h> #include <string.h> #include <stdlib.h> #inc ...
- android如何添加桌面图标和卸载程序后自动删除图标
android如何添加桌面图标和卸载程序后自动删除桌面图标,这是一个应用的安装与卸载过程对桌面图标的操作,下面与大家分享下具体是如何实现的,感兴趣的朋友可以参考下哈 1:创建图标如下 Intent i ...
- UVA 10763 Foreign Exchange 出国交换 pair+map
题意:给出很多对数字,看看每一对(a,b)能不能找到对应的(b,a). 放在贪心这其实有点像检索. 用stl做,map+pair. 记录每一对出现的次数,然后遍历看看对应的那一对出现的次数有没有和自己 ...
- 32位程序在64位系统上获取系统安装时间(要使用KEY_WOW64_64KEY标记)
众所周知,取系统的安装时间可取注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion的子项InstallDate,此值是个 ...
- zookeeer 集群和伪集群模式
环境变量设置: # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # U ...