呼叫
swap
進行數值交換
一般我們會這麼寫:
#include
using namespace std;
void swap(int*p1,int*p2);
int main(int argc,int*argv)
void swap(int*p1,int*p2)
swap
函式以指標為引數進行呼叫,在
swap
函式中交換的是指標所指的數值。也就是說指標指向的位置沒有變化,只是指向那個位置的數值進行了交換
發生了變化。
我們這麼想:在
swap
中交換指標會不會發生變化呢?程式可以改為:
#include
using namespace std;
void swap(int*p1,int*p2);
int main(int argc,int*argv)
void swap(int*p1,int*p2)
可見在swap
中,兩個指標所指向的數值確實發生了變化。可是當跳出
swap
時,會發現兩個指標所指向的數值沒有發生變化。為什麼?
有關形參與實參的說明
函式在發生呼叫時,函式中的形參才被分配記憶體單元,以便接受從實參來的資料。呼叫結束後,形參所佔的記憶體單元也被釋放。
實參變數對形參變數的資料傳遞是「值傳遞」,即單向傳遞,只由實參傳給形參,而不能由形參傳回來給實參。
由此可以這麼解釋第二段程式:p,q以引數的形式進行傳遞到swap函式中,此時函式被呼叫從而開闢了p1,p2兩個形參的空間接收p,q。在swap中確實實現了兩個指標形式引數的交換。又由於實參對形參的傳遞是單向的,且只能實參向形參進行傳遞。在swap中兩個形式引數p1,p2指向的位置發生了變化,但是它對於數值空間沒有任何影響,(p還是指向a,a還是等於10,q還是指向b,b還是等於20)。當swap呼叫結束時,形式引數p1,p2釋放,最終的結果就是swap做了無用功。
補充:兩個數值a,b交換不使用中間變數的方法:
a=a+b;
b=a-b;
a=a-b;
關於數值交換的幾種方法
在大量的開發中常常會遇到需要交換兩個數值的問題,今天就給大家分享一些數值交換方面的方法 第一種方法 這也是大家最容易想到的方法,即利用中間變數達到交換兩個數的目的,具體如下 int tmp tmp i1 i1 i2 i2 tmp 這種方法執行效率是最低了 第二種方法 利用數學中的運算技巧 i1 i1...
關於交換函式Swap的常見錯誤和用法
關於野指標 也稱為懸掛指標,你沒有訪問許可權的位址 指標 這個指標有可能不存在也有可能存在但是你不能訪問 野指標很麻煩,不好判斷 1.位址不存在 2.位址存在但是不能訪問 3.位址之前可以訪問,但現在不可以 結論 乙個函式 父函式 呼叫另乙個函式 子函式 想通過子函式修改父函式的資料.必須傳指標,子...
matlab進行數值積分的主要函式使用方法
matlab進行數值積分的主要函式 1.trapz 梯形法求解積分 x 0 pi 10 pi y sin x trapz x,y 2.quad 基於變步長simpso法求積分 q quad fun,a,b,tol 其中fun是被積函式檔名或函式控制代碼,a,b是積分下限和積分上限,tol是積分精度 ...