1. 程式人生 > >關於函式實現數值交換

關於函式實現數值交換

#include <stdio.h>  

void swap0(int a ,int b)
{
  printf(" a addr : %d , b addr: %d\n", &a , &b);
  int temp = a;
  a = b;
  b = temp;
}

int main()  
{  
 int x=3 , y=5;
 printf(" x addr : %d , y addr: %d\n", &x , &y);
 printf(" x : %d , y : %d\n", x , y);
 swap0( x, y);
 printf(" x : %d , y : %d\n", x , y);

return 0;
}

執行結果:

 x addr : 1703740 , y addr: 1703736
 x : 3 , y : 5
 a addr : 1703652 , b addr: 1703656
 x : 3 , y : 5
Press any key to continue

表明:採用值呼叫方式無法交換實參的值,呼叫交換swap0導致實際引數x和y的值分別複製到形式引數a和b中,系統為形參a、b分配新的記憶體地址,故改變形參的值對實參無影響。在交換體內,a和b的值互換,函式終止。 終止後,a和b的新值不會被複制回實際引數。 因此,實際引數的值不受功能的影響。

#include <stdio.h>  
void swap1(int *a , int *b)//使用指標方式修改指向記憶體塊的值, 傳值方式
{
  printf(" a addr : %d , b addr: %d\n", &a , &b);
  printf(" a memory block addr : %p , b memory block addr: %p\n", a , b);
  int temp = *a;
  *a = *b;
  *b = temp;
  printf(" a addr : %d , b addr: %d\n", &a , &b);
  printf(" a memory block addr : %p , b memory block addr: %p\n", a , b);
}

int main()  
{  
 int x=3 , y=5;
 printf(" x addr : %d , y addr: %d\n", &x , &y);
 printf(" x memory block addr : %p , y memory block addr: %p\n", &x,&y);
 printf(" x : %d , y : %d\n", x , y);
 swap1( &x, &y);
 printf(" x : %d , y : %d\n", x , y);
 return 0;
}
執行結果:

 x addr : 1703740 , y addr: 1703736
 x memory block addr : 0019FF3C , y memory block addr: 0019FF38
 x : 3 , y : 5
 a addr : 1703652 , b addr: 1703656
 a memory block addr : 0019FF3C , b memory block addr: 0019FF38
 a addr : 1703652 , b addr: 1703656
 a memory block addr : 0019FF3C , b memory block addr: 0019FF38
 x : 5 , y : 3
Press any key to continue

可以發現:採用指標方式修改指向記憶體塊的值時,也會為形參分配新的地址,但是形參指向的記憶體塊的地址與實參相同,故對形參指向的記憶體塊的值進行修改,實參指向的記憶體塊的值即發生相同的改變,故可以完成值的交換。

#include <stdio.h> 
void swap2(int &a , int &b)//使用引用方式,串引用方式
{
  printf(" a addr : %d , b addr: %d\n", &a , &b);
  int temp = a;
  a = b;
  b = temp;
}

int main()  
{  
 int x=3 , y=5;
 printf(" x : %d , y : %d\n", x , y);
 printf(" x addr : %d , y addr: %d\n", &x , &y);
 swap2(x , y);
 printf(" x : %d , y : %d\n", x , y);

 return 0;
}  
執行結果:

 x : 3 , y : 5
 x addr : 1703740 , y addr: 1703736
 a addr : 1703740 , b addr: 1703736
 x : 5 , y : 3
Press any key to continue

可以發現:利用引用引數可以成功完成數值交換,呼叫swap2(x,y);則int &a=x;int &b=y; 那麼a相當於x的別名,b相當於y的別名,交換a和b的值即相當於交換x和y的值。

注:引用是一種特殊型別的變數,我們可以認為它是另一個變數的別名,利用引用名和原來的變數名訪問變數的效果是一樣的。引用的形式是:型別識別符號 &引用名。比如:

       int  i, j; 
       int &ri=i;    // 建立一個int型的引用ri,並將其初始化為變數i的一個別名
       j=10;
       ri=j;          // 相當於 i=j;




相關推薦

關於函式實現數值交換

#include <stdio.h> void swap0(int a ,int b) { printf(" a addr : %d , b addr: %d\n", &a , &b); int temp = a; a = b;

函式實現交換數值

敲黑板劃重點 用函式實現兩個數字內容的交換,你可能會這樣做: void change_num(int a, int b) { int tmp = a; a = b; b = tmp; } 感覺太簡單了阿,然後呼叫函式,大功告成 結果發現,,,emmm,不對啊 內容沒有交換

三種方法實現整型數值交換

int 異或 交換 實現 整型 數值交換 臨時 變量 a+b 臨時變量法: int a = 5; int b = 4; int temp = 0; temp = a; a = b; b = temp; 異或法: int a = 5; int b = 6; a = a^b;

practise函式實現——乘法口訣表,判斷素數,交換兩數,判斷閏年,陣列的初始清空逆置

1 .實現一個函式,列印乘法口訣表,口訣表的行數和列數自己指定,     輸入9,輸出9*9口訣表,輸出12,輸出12*12的乘法口訣表。  #include<stdio.h> #include<windows.h> voi

使用函式實現兩個數的交換

#include <stdio.h> void swap(int *a,int *b) { int tmp; tmp=*a; *a=*b; *b=tmp; } int main()

C語言:使用函式實現兩個數的交換

此題的解決思路為:建立一個Swap函式,引數為a和b,函式內部建立一個臨時變數tmp,用於交換兩個數。 但需要注意的是:函式傳參的過程中需要注意,形參是實參的一份臨時拷貝,形參的改變不會影響實參,所以此時函式傳參的時候需要傳遞實參的地址(&a),即傳址呼叫,在接收部

C用交換函式實現三個數排序

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> void swap(int *m,int

Java中異或運算實現兩個整數的交換以及其功能函式實現

       今天學習到一種超酷炫的交換兩個整數的方法,給各位分享一下。異或運算屬於位運算的一種,首先簡單介紹一下異或預算的語法規則。 假設a與b為不相等的兩個整數。 (1)a^a=0; (2)a^b

使用函式實現兩個數的交換

#include<stdio.h> int swap(int *num1,int *num2) //異或方法交換 { *num1=*num1^*num2;

java版——實現兩個數值交換的四種方式

實現兩個數值交換,最常用的莫過於中間變數法,那是不是還有別的方式呢。請看下文: class Operator { // 實現兩個數值交換的多種方式 public static void main(

C 使用函式實現兩個數的交換

1.程式程式碼 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <Windows.h> int change_num(int *n1, int *n2)

JAVA_三種方法實現兩個整形變數的數值交換

JAVA中的基本資料交換方式有三種: 1.藉助中間變數 例:int a = 10 , b = 20 , c;   //建立了三個變數,這裡的c即為我們的中間變數,在隨後的數值交換中起到了一個交換"橋樑

用異或操作實現交換函數用以實現數組逆置中須要註意的問題

span include style 試題 blog text fontsize lib mod 用元素交換函數實現數組逆置非常easy,如以下代碼:(數組左右元素交換) #include<iostream> #include<stdlib.h>

數值交換,三種初學者方法。

static nbsp ont pri 三種 pan 初學 span public 第一種: public class jiaohuan { public static void main(String[]args) { int a=1,b=2; int m,n;

如何實現不同交換機上的終端在同一VLAN上互聯?

vlan如何實現不同交換機上的終端在同一VLAN上互聯?如下圖: PC0,PC1和PC4在同一VLAN ,PC2和PC3在同一VLAN,怎麽實現同一VLAN 上的終端互通呢? 我們知道在交換機不做任何配置的時候,所有端口都在同一個默認vlan下,所以將終端配置好IP地址之後5臺PC就可以互通,但是現

C語言 trim函式實現

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> //去除尾部空格 char *rtrim(char *str) { if(str == N

Python內建進位制轉換函式(實現16進位制和ASCII轉換)

在進行wireshark抓包時你會發現底端視窗報文內容左邊是十六進位制數字,右邊是每兩個十六進位制轉換的ASCII字元,這裡使用Python程式碼實現一個十六進位制和ASCII的轉換方法。 hex() 轉換一個整數物件為十六進位制的字串 >>> hex(16) '0x10' >&

利用MYSQL的函式實現使用者登入功能,進出都是JSON(第二版)

利用MYSQL的函式實現使用者登入功能,進出都是JSON(第二版) CREATE DEFINER=`root`@`%` FUNCTION `uc_session_login`( `reqjson` JSON, `srvjson` JSON ) RETURNS json LANGUAGE

socket程式設計readline函式實現回射伺服器/客戶端

為了解決粘包問題,reanline函式使用recv函式進行窺探,不清除內容 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/