傳值呼叫與傳址呼叫

2021-09-20 03:27:17 字數 2050 閱讀 2058

眾所周知,函式的呼叫分為傳值呼叫和傳址呼叫,那他們的區別是什麼呢?

傳值呼叫:

函式的形參和實參分別占有不同的記憶體塊,對形參的修改不會影響實參。

傳址呼叫:

傳址呼叫是把函式外部建立變數的記憶體位址傳遞給函式引數的一種呼叫函式的方法。

這種傳參方式可以讓函式和函式外邊的變數建立起真正的聯絡,也就是函式的內部可以直接操作函式外部的變數。

用文字解釋未免太過於蒼白,接下來我們用例項來證明:

我們用之前寫過的交換倆個變數的值作為例子。(這次我們用呼叫函式的方法來寫)

#include#includeswap(int x, int y)

int main()

如果不出意外的話,我們的a和b的值已經交換了,那我們讓程式run起來,看一看結果

嗯???a和b的值並沒有交換呀!

上面的程式中,a和b是實參,他們都有相應的值,而x,y是形參,swap函式的形參和實參占有不同的記憶體塊,對形參x和y的修改是不會影響實參a和b的值。

這樣會不會好理解很多呢?

為了讓大家清楚的看到這一現象,我們對**稍加修改

在swap函式中我們看看它是否完成了數值的交換,**做以下修改:

int tmp;

printf("before :x: %d y: %d \n", x, y);

tmp = x;

x = y;

y = tmp;

printf("after :x: %d y: %d \n", x, y);

}

修改之後,我們再來看看結果

(有人可能會問,為什麼x,y的輸出語句在中間呀,我們回過頭看之前的**,是不是先執行和a和b的before輸出語句,再呼叫的函式啊,所有swap函式的輸出語句就是在中間啦)

顯而易見,x和y的值是交換過的,但是a和b的值卻沒有被改變。

那麼,要想呼叫函式,又要正確的把值交換,我們應該怎麼做呢?接下來就是傳址呼叫的show time了!

我們先把**看一看

#include#includeswap(int *x, int *y)

int main()

我們看一看執行結果:

喜大普奔,a b的值終於交換啦!!!

細心的同學肯定發現了**中的不同,我們來看一看

不同1:

//x y變成了*x *y

swap(int *x, int *y)

不同2:

swap(a,b); 變成  swap(&a, &b);
那麼*x和&a分別是什麼意思呢?

*x是乙個指標變數

&a可以理解為取變數a的位址

這裡給大家簡單講一下指標

指標:儲存位址的變數

ok,到這之後我們稍微修改一下**,看看a,b的位址

int main()

執行結果為:

我們看到,當a b值交換過後,其位址並沒有變化。這就是我們的傳址呼叫啦!

傳值呼叫 傳址呼叫

void swap int x,int y int tmp x x y y tmp int main int a 10 int b 20 printf a d b d n a,b swap a,b 傳值呼叫,僅僅是傳值,其實x賦值為10,y賦值為20了,swap函式也用了,printf a d b ...

函式呼叫的傳值和「傳址」

函式呼叫的傳值和 傳址 以下文字只想說明乙個問題 所有的引數傳遞都是傳值 要想通過函式改變乙個變數的值,只有將此變數的位址傳入函式。其實c語言中根本沒有傳址這一 說,所有的函式在傳遞引數時都是採用的傳值呼叫,即在呼叫時完成 實參對形參的賦值,也就是說在傳遞引數時永遠都是將實參的值傳遞給形參。形參是乙...

傳值呼叫與傳位址呼叫(傳引用)

c c 中引數傳遞有兩種方式,傳值或傳位址 傳引用 通常我們要在被呼叫函式中改變乙個變數的值就需要傳位址呼叫方式,例如 void swap by value int a,int b void swap by ptr int pa,int pb int main int argc,char argv ...