最近一直被c++的值傳遞,引用傳遞,指標傳遞這些概念所困擾,一直沒有乙個能說清他們之間的關係通過乙個簡單的例項,或者說淺顯的說法,找了一些相關資料,和自已的個人感受,簡單介紹一下,希望高人指正
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
using namespace std;
func(int x);
void main()
以下是「指標傳遞」的示例程式。
由於func2函式體內的x是指向外部變數n的指標,改變該指標的內容將導致n的值改變,所以n的值成為10。//
因為n的位址被傳遞給了func函式,使得x=&n
。#include
using namespace std;
func(int *x);
void main()
以下是「引用傳遞」的示例程式。
///int a,&ra=a; //
a為目標原名稱,ra為目標引用名。給ra賦值:ra=1; 等價於 a=1;
由於func3函式體內的x是外部變數n的引用,x和n是同乙個東西,改變x等於改變n,所以n的值成為10。
#include
using namespace std;
func(int &x);
void main()
值傳遞,引用傳遞,指標傳遞
值傳遞 形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的 實參 形參 引數的值只能傳入,不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。指標傳遞 形參為指向實參位址的指標,當對形參的指向操作時,就相當於對實參本身進行的操作。引...
指標傳遞 引用傳遞 值傳遞
用指標變數可以表示各種資料結構,能很方便地使用陣列,字串和鍊錶。並不是直接運算元據,而且它可以直接和記憶體打交道,使用稍有不慎,就會造成程式崩潰。使用指標的好處 1 在資料傳輸時,如果資料塊較大,這時就可以使用指標傳遞位址而不是實際資料。提高傳輸速度,又節省大量記憶體。2 在資料結構中,鍊錶 樹 圖...
c 值傳遞 指標傳遞 引用傳遞
值傳遞 形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的 實參 形參 引數的值只能傳入,不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。指標傳遞 形參為指向實參位址的指標,當對形參的指向操作時,就相當於對實參本身進行的操作 引...