相信以下這個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函數 进阶探讨与实现的更多相关文章

  1. oracle decode(nvl(estimate_qty,0),0,1,estimate_qty) 函數

    oracle   decode(nvl(estimate_qty,0),0,1,estimate_qty) 函數

  2. js匿名函數

    (function($){})(jquery) == (function($){})(jQuery) 实际上是匿名函数 用于存放开发插件的代码 作用(非常有用): 这种写法的最大好处是形成闭包.在(f ...

  3. Math.Round函數

    Math.Round這個函數的解釋是將值按指定的小數位數舍入,但並不就是四捨五入.這種舍入有時稱為就近舍入或四舍六入五成雙 其實在 VB, VBScript, C#, J#, T-SQL 中 Roun ...

  4. C#判断奇偶数的函數

    // 现代流行的"程序员" public static bool IsOdd(int n) { while (true) { switch (n) { : return true; ...

  5. PHP 計算字符串長度函數

    PHP內置的字符串長度函數strlen無法正確處理中文字符串,它得到的只是字符串所占的字節數.對於GB2312的中文編碼,strlen得到的值是漢字個數的2倍,而對於UTF-8編碼的中文,就是3倍的差 ...

  6. SQL窗体函數一例

    需求: MSSQL,列出服務實例中全部數據庫的例如以下信息: 數據庫ID.數據庫名.創建日期.數據文件類型.數據文件大小.數據庫總大小.文件所在路徑. 寫法(後面的百分比為所花時間占比): -- 连接 ...

  7. js函數

    函數是什麼?函數就是被事件驅動或者調用執行的可重複的代碼塊. 函數聲明: 使用關鍵詞function,關鍵詞function大小敏感. function a{代碼塊} 局部變量: 在函數內部聲明的變量 ...

  8. concat函數 函數concat 可以用來合拼兩個或以上的字串。

    12. “Mexico 墨西哥”的首都是”Mexico City”. 顯示所有國家名字,其首都是國家名字加上”City”. concat函數 函數concat 可以用來合拼兩個或以上的字串. : SE ...

  9. (C/C++) 指向函數的指標

    最近再跟指標做朋友, 正好遇到函數與指標. 其實函數也在程式內也是有屬於自己的位址 所以指標一樣能指向函數, 在此釐清自己的觀念以及記錄下來. #include <stdio.h> #in ...

随机推荐

  1. Ruby学习: 类的定义和实例变量

    ruby是完全面向对象的,所有的数据都是对象,没有独立在类外的方法,所有的方法都在类中定义的. 一.类的定义语法 类的定义以 class 关键字开头,后面跟类名,以 end标识符结尾. 类中的方法以 ...

  2. ubuntu 下关闭MySql server

    转自 http://blog.csdn.net/tobacco5648/article/details/7625048 在终端输入命令 开启:     sudo   /etc/init.d/mysql ...

  3. Maven--几个需要补充的问题(三)

    <Maven--搭建开发环境(一)> <Maven--构建企业级仓库(二)> <Maven—几个需要补充的问题(三)> 前两篇由于篇幅太长,为了给读者理解方便,这篇 ...

  4. Linux下which、whereis、locate、find 区别

    我们经常在linux要查找某个文件或命令,但不知道放在哪里了,可以使用下面的一些命令来搜索.which      查看可执行文件的位置 whereis    查看文件的位置 locate     配合 ...

  5. 【Oracle】不安装Oracle客户端直接用PL/SQL连接数据库

    1.下载 instantclient_11_2.zip PL/SQL2.解压instantclient_11_2.zip到相应文件夹,比如:E:\oracleclient\instantclient_ ...

  6. c++,内联成员函数

    内联成员函数有两程方式实现内联成员函数1)在声名成员函数的同时定义成员函数体2)声明成员函数时,在最前面加上inline关键字在定义成员函数时也在最前面加上inline关键字 建议inline函数在头 ...

  7. MFC工程的复制

    MFC工程的复制 [1]       在VS中新建一个同类型的MFC工程. [2]       复制.rc资源文件,用记事本打开旧工程和新工程的.rc文件,将旧工程的对应部分复制到新工程的对应部分,文 ...

  8. Android string.xml error: Apostrophe not preceded by \

    Android string.xml error: Apostrophe not preceded by \ 遇到了这个错误,编译无法通过 error: Apostrophe not preceded ...

  9. Clojure学习:表达式与函数

    Clojure是一门Lisp方言——确切地说,是一门JVM上的Lisp方言——也是一门非纯粹的函数式语言. Clojure理所当然地秉承了Lisp“代码即数据( code is data! )”的设计 ...

  10. c# 数据库编程(通过SqlCommand 执行数据库查询)

    前面一篇文章,我们介绍了如何在c#中对数据库进行更新操作.主要是利用SqlCommand 对象的ExecuteNonQuery方法. 这篇文章介绍,如何进行查询操作.本文给出的例子仍然是针对sql s ...