1. 程式人生 > >【C++筆記】函式中引數傳遞

【C++筆記】函式中引數傳遞

函式中引數是如何傳遞的呢?

在《C++Primer》一書中提到:

“Each time we call a function, its parameters are created and initialized by the arguments passed in the call。”(每次呼叫函式時,都會重新建立該函式所有的形參,此時所傳遞的實參將會初始化對應的形參。)

可能會有點模糊,說白了就是在呼叫函式時,如果函式中有引數,則函式中的引數會先被創建出來,然後把傳入函式的實參的值一一賦值給你所建立的引數,而這個你所建立的引數就是上面所說的形參。

理解函式中的引數的傳遞也是挺重要的,這也有助於你在實現函式的這類方法的時候靈活得到應用。

關於函式的傳遞,其它的不多說,這裡我們就來處理一個問題就行了,這問題如下:

通過函式來改變現有實參的值。

感覺好像很簡單,其實這當中如果你不瞭解其中引數傳遞的本質,可能會處理不好這個問題。

舉個簡單的例子,看以下程式碼:

#include<iostream>
using namespace std;
void Swap(int a, int b){
	int temp;
	temp = a;
	a = b;
	b = temp;
}
int main()
{
	int a = 1, b = 2;
	cout << "交換前:" << endl;
	cout << "a = " << a << "\t" << "b = " << b << endl;
	Swap(a, b);
	cout << "交換後:" << endl;
	cout << "a = " << a << "\t" << "b = " << b << endl;
<span style="white-space:pre">	</span>return 0;
}

這裡嘗試著兩個int型的變數值進行交換,結果如下:


如果我們想對兩個int型變數的值進行交換,Swap函式並不可以實現真正的交換。為什麼?函式體裡不是實現了交換了嗎?是的,的確是進行交換了,但是交換的是實參的拷貝。

上面一開始就有提到,函式被呼叫時,函式形參被建立並賦值為實參的值。但是這並不會影響實參現有的值,即實參值保持不變。

所以這裡如果要進行真正值得交換,有很多方法,比如形參作為引用再把實參傳入:

void Swapanother(int &a, int &b){
	int temp;
	temp = a;
	a = b;
	b = temp;
}

呼叫如下:

Swapanother(a, b);
或是形參作為指標,把實參地址傳入:
void Swap(int *a, int *b){
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
呼叫如下:
Swap(&a, &b);
這兩種方法都可以改變實參的值,結果如下:



總結:

1.呼叫函式時函式中的引數會先另外創建出來,然後再其賦予對傳入實參的值。

2.修改傳入實參的值可以通過形參引用或者指標傳址的方式修改。