相信以下這個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. QT直接支持GB18030,附它对此编码的一堆相关文档描述

    http://doc.qt.io/qt-5/qtextcodec.html http://doc.qt.io/qt-5/codec-gbk.html

  2. Android 6.0 新特性 整理 资料来自网络

    Android 6.0新特性 Runtime Permissions Doze and App Standby Apache HTTP Client Removal BoringSSL Access ...

  3. android中使用DisplayMetrics获取屏幕参数

    --关于Density int android.graphics.Bitmap.getDensity(),返回bitmap-density(密度).默认的density就是当前display-dens ...

  4. HDU p1294 Rooted Trees Problem 解题报告

    http://www.cnblogs.com/keam37/p/3639294.html keam所有 转载请注明出处 Problem Description Give you two definit ...

  5. CSS的三种样式:内联式,嵌入式,外部式以及他们的优先级

    从CSS 样式代码插入的形式来看基本能够分为下面3种:内联式.嵌入式和外部式三种. 1:内联式css样式表就是把css代码直接写在现有的HTML标签中,如以下代码: <p style=" ...

  6. c 中有关打印*,字符的题目集

    #include<stdio.h> //1.打印* void priStar() { printf("输入一个整数\n"); int num; scanf(" ...

  7. Python 第十二篇:HTML基础

    一:基础知识: HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可 ...

  8. Xcode6项目运行在真机上未铺满整个屏幕

    如图 解决见图: 再次运行:

  9. django-crispy-forms入门指南

    django-crispy-forms 是对django form在html页面呈现方式进行管理的一个第三方插件. 配置: 在INSTALLED_APPS中加入'crispy_forms' djang ...

  10. Python 数据处理扩展包: pandas 模块的DataFrame介绍(读写数据库的操作)

    1.读取表中的内容,如下例子: import MySQLdb try: conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='root ...