1. 程式人生 > >值傳遞,指標傳遞,引用傳遞

值傳遞,指標傳遞,引用傳遞

    c++中傳遞引數的方式有三種:傳引數的值(稱為值傳遞,簡稱傳值),傳引數的地址(稱為地址傳遞,簡稱為傳址),和引用傳遞(簡稱為傳引用),相應的函式也就是傳值呼叫,傳址呼叫和傳引用呼叫
     函式定義時引數表中的引數稱為形式引數,簡稱形參,函式呼叫時引數表中的引數稱為實際引數,簡稱實參,實參和形參之間的資料傳遞稱為形實結合,通常情況下c++語言是傳值呼叫,傳值呼叫是單向的,即引數的值只能由實參傳遞給形參,而不能反過來由形參傳遞給值參,也就是說,從被呼叫函式的角度來看,引數的值只能傳入不能傳出。傳值呼叫時實參可以是具體的數值、已經有值的變數和可求值的表示式,由於數值和變數都是表達市的一種,因此,傳值呼叫時實參本質上是表示式。當函式被呼叫時,系統首先對實參表示式球值,然後將值傳遞給形參,換過一種思路,傳值呼叫時,形參實際上是實參的一份拷貝,所以傳遞時不會改變外部變數實參的值,


   假設宣告一個變數int n=1;那麼他在記憶體中的儲存,我們可以這樣來理解,第一:記憶體中1是指變數n的值,儲存這個值的地址我們把他稱為1的記憶體地址,也就是指標地址,n是他的名字,或者我們把他叫做1的大名,另外我們可以給他起一個別的名字,叫做小名,也叫別名,因為大名和小別都是指向同一個值,所以改變大名的值也就是改名小名的值,小名是大名的一種引用,理清了上面這些含義,我們就來舉個例子.
int m;
int &n=m;
n是m的引用reference,m是被引用物referent。n相當於m的別名,
引用的一些規則如下:
(1)引用被建立的同時必須被初始化(指標則可以在任何時候被初始化)。

(2)不能有NULL引用,引用必須與合法的儲存單元關聯(指標則可以是NULL)。
(3)一旦引用被初始化,就不能改變引用的關係(指標則可以隨時改變所指的物件)。
引用的主要功能是傳遞函式的引數和返回值。
C++語言中,函式的引數和返回值的傳遞方式有三種:值傳遞、指標傳遞和引用傳遞.

以下是“值傳遞”的示例程式。
由於Func1函式體內的x是外部變數n的一份拷貝,改變x的值不會影響n,所以n的值仍然是0。
#include <iostream>

using namespace std;

func(int x);

void main(){
 int n=0;
 func(n);
 cout<<n<<endl;
}

func(int x){
 x = x + 10;
}

以下是“指標傳遞”的示例程式。
由於Func2函式體內的x是指向外部變數n的指標,改變該指標的內容將導致n的值改變,所以n的值成為10。
#include <iostream>

using namespace std;

func(int *x);

void main(){
 int n=0;
 func(&n);//此處直接傳指標或地址就可以
 cout<<n<<endl;
}

func(int *x){
 *x = *x + 10;
}

以下是“引用傳遞”的示例程式。
由於Func3函式體內的x是外部變數n的引用,x和n是同一個東西,改變x等於改變n,所以n的值成為10。
#include <iostream>

using namespace std;

func(int &x);

void main(){
 int n=0;
 func(n);
 cout<<n<<endl;
}

func(int &x){
 x = x + 10;
}