C++的值傳遞,引用傳遞,指針傳遞這些概念一直是困擾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 <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;
}
本文出自 “驿落黃昏” 博客,請務必保留此出處http://yiluohuanghun.blog.51cto.com/3407300/1163446