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 ...
随机推荐
- BZOJ 1742: [Usaco2005 nov]Grazing on the Run 边跑边吃草( dp )
dp... dp( l , r , k ) , 表示 吃了[ l , r ] 的草 , k = 1 表示最后在 r 处 , k = 0 表示最后在 l 处 . ------------------- ...
- eclipse the user operation is waiting for building workspace" to complete
"the user operation is waiting for building workspace" to complete", 解决办法: 1.选择菜单栏的“P ...
- 浏览器与服务器间的交互(客服端 <---> 服务器)
浏览器与服务器间的交互(客服端 <---> 服务器) 请求--->处理--->响应 对类HttpContext 内部成员的使用 例如 :Request .Response . ...
- jQuery UI Widget 原理
先看下代码的相关注释: /*! * jQuery UI Widget 1.8.1 * * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/abo ...
- CodeForces 276D – Little Girl and Maximum XOR 贪心
整整10个月后第二次搞这个问题才搞懂........第一次还是太随意了. 解题思路: 经过打表可得规律答案要么是0 要么是2的N次 - 1 要得到最大的XOR值,其值一定是2的N次 - 1 即在 l ...
- c# 数据库编程(通过SqlCommand 执行数据库查询)
前面一篇文章,我们介绍了如何在c#中对数据库进行更新操作.主要是利用SqlCommand 对象的ExecuteNonQuery方法. 这篇文章介绍,如何进行查询操作.本文给出的例子仍然是针对sql s ...
- 带符号的char类型取值范围为什么是-128——127
以前经常看到带符号的char类型取值范围是-128——127,今天突然想为什么不是-127——127,-128是怎么来的? 127好理解,char类型是8位,最高位是符号位,0正1负,所以011111 ...
- Android 文件共享服务器
http://download.csdn.net/detail/liduanw/6271075 你可以将自己的手机作为(局域网)服务器, 使用方法: 1> 指定共享根目录 2> 点击启动 ...
- PHP - FTP上传文件类
/** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) * 时间:2006/5/9 * 作者:欣然随风 * QQ:276624915 */ class class_ftp { publi ...
- iOS开发网络数据之AFNetworking使用1
链接地址:http://blog.csdn.net/daiyelang/article/details/38421341 如何选择AFNetworking版本 官网下载2.5版本:http://afn ...