1. 程式人生 > >C++中值傳遞、指標傳遞、引用傳遞

C++中值傳遞、指標傳遞、引用傳遞

1. 值傳遞:形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的(實參->形參),引數的值只能傳入,不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。

void swap(int a,int b)
{
     int temp;
     temp=a;
     a=b;
     b=temp;
     cout<<a<<’ ‘<<b<<’\n’;
}

int main(){
     int x=1;
    int y=2;
    swap(x,y);
    cout<<x<<’ ‘<<y<<’\n’;
    
    return 0;
}

用gdb除錯後發現,x,y的地址分別是0xffbef938, 0xffbef934, 值分別是1,2。而形參a,b的地址分別是0xffbef918,0xffbef914, 雖然它們儲存的值和x,y一樣,都是1,2,但是這只是拷貝過來的。swap只交換了a,b,並不會改變x,y的值。輸出為2,1;1,2

2. 指標傳遞:

void swap(int *a,int *b)
{
     int temp;
     temp=*a;
     *a=*b;
     *b=temp;
     cout<<*a<<’ ‘<<*b<<’\n’;
}

int main(){

   int x=1;
    int y=2;
    swap(&x,&y);
    cout<<x<<’ ‘<<y<<’\n’;

}

輸出結果是2,1;2,1。實參x,y, 形參a,b的地址同上,但是a,b的內容分別為0xffbef938(x的地址),0xffbef934(y的地址),*a也就是0xffbef938記憶體中存放的內容,即x的值1。簡單地說,a是一個指向外部實參地址的指標,*a是指標的內容,如果改變了*a也必然導致外部實參的改變。

3. 引用傳遞:

void swap(int &a,int &b)
{
     int temp;
     temp=a;
     a=b;
     b=temp;
     cout<<a<<’ ‘<<b<<’\n’;
}

int main(){
    
    int x=1;
    int y=2;
    swap(x,y);
    cout<<x<<’ ‘<<y<<’\n’;
    return 0;
}

輸出是2,1;2,1。實參x,y的地址同上。然而與指標傳遞不同的是,形參a,b的地址也與x,y相同,即0xffbef938, 0xffbef934。這樣一來,交換a,b就相當於交換x,y。

指標傳遞和引用傳遞一般適用於:函式內部修改引數並且希望改動影響呼叫者。對比值傳遞,指標/引用傳遞可以將改變由形參“傳給”實參(實際上就是直接在實參的記憶體上修改,不像值傳遞將實參的值拷貝到另外的記憶體地址中才修改)。指標/引用傳遞的另外一種用法是:當一個函式實際需要返回多個值,而只能顯式返回一個值時,可以將另外需要返回的變數以指標/引用傳遞給函式,這樣在函式內部修改並且返回後,呼叫者可以拿到被修改過後的變數,也相當於一個隱式的返回值傳遞吧。

至於指標/引用傳遞的格式,可以參考以下的內容:

int x=1;

int *y=&x; //用於指標傳遞,y有自己獨立的記憶體地址,儲存的內容是x的地址,*y是x的值

int &z=x; //用於引用傳遞,可以理解為z就是x,x就是z,只不過名字不一樣

最後再囉嗦一個例子:

int change1(char* name){
    name=”alter”;
    return 1;
}

int change2(char* &name){
    name=”alter”;
    return 1;
}

int main(){
    char* string=”original!”;
    change1(string);
    cout<<string<<’\n’;

    change2(string);
    cout<<string<<’\n’;

}

結果:original!;alter。change1是值傳遞,形參name有自己獨立的記憶體地址,內容是拷貝string的內容(string的內容是”original”的地址),修改後name的內容變成了“alter”的地址。change2是引用傳遞,形參name的地址就是string的地址,或者說name就是string

相關推薦

C++傳遞指標傳遞引用傳遞

1. 值傳遞:形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的(實參->形參),引數的值只能傳入,不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。 void swap(int a,int b

C++傳遞指針傳遞引用傳遞的總結

地址 變形 不同的 值傳遞 class col 並不會 單向 角度 C++中值傳遞、指針傳遞、引用傳遞的總結 指針傳遞和引用傳遞一般適用於:函數內部修改參數並且希望改動影響調用者。對比值傳遞,指針/引用傳遞可以將改變由形參“傳給”實參(實際上就是直接在實參的內存上修改,

C++函式指標指標函式返回為函式指標的函式淺談

C++函式指標、指標函式、返回值為函式指標的函式淺談 引言 函式指標、指標函式是C中重要而容易混淆的概念,博主將通過兩個例項來說明這兩個截然不同的概念。 而返回值為函式指標的指標函式就更難理解了,放在文章的最後來介紹。 函式指標 函式指標是一種特殊的 指標,它指向函式的入口。

C++的函式的傳呼叫指標呼叫引用呼叫的聯絡區別

當呼叫函式時,有兩種向函式傳遞引數的方式: 呼叫型別 描述 傳值呼叫 該方法把引數的實際值複製給函式的形式引數。在這種情況下,修改函式內的形式引數對實際引數沒有影響。 指標呼叫 該方法把引數的地址複製給形式引數。在函式內,該地址用於訪問呼叫中要用到

C#型別和引用型別引數傳遞

原則:儘可能控制對資料的修改,如果可以預測某個資料不會或不應該被改變,就要對其控制,而不要期望使用這個資料的呼叫者不會改變其值。 如果引數在使用過程中被意外修改,將會帶來不可預知的結果,而且這種錯誤很難被檢查到,所以我們在設計方法引數的時候,要充分考慮傳遞引用型別引數或者引用方式傳遞引用型別

C#傳遞引用傳遞的區別

以值傳遞引數 當實參當作值來傳遞時,就產生了一個新的拷貝。 class Test { static void Main(string[] args) { int x=8; Fo(x);

C++為什麼要用虛擬函式指標引用才能實現多型?

學過C++的都知道,要實現C++的多型性必須要用到虛擬函式,並且還要使用引用或者指標,以前學習的時候書本上也是這麼說, 但是書本上沒有說為什麼?   其實只要你認真思考過這個問題你會有三個疑問: 為什麼要用虛擬函式? 為什麼要用指標或者引用? 為什麼使用派生類和基類物件

c# 傳遞引用傳遞

物件在方法間傳值,傳遞的是物件的值,或者這個物件的引用的副本; //首先建立一個物件 public class OrderInfo { public string OrderName { get; set; } } //建立一個方法去改變這個物件 p

深拷貝淺拷貝以及引用傳遞和按傳遞的區別與聯絡

python的值傳遞不會改變傳入引數的值,而引用傳遞傳入的是一個地址。有點相似c的指標。在執行完畢之後會改變傳入地址所指的值。 值傳遞型別例如以下: 上面的程式碼僅僅是將a的值作為引數傳遞進去。程式執行完之後a的值並未改變 1 2 3 4 5 6

C++傳遞引用傳遞的區別

    最近補資料結構和演算法時,捎帶著學了些C++,剛好看到一篇關於值傳遞和引用傳遞的文章,收穫頗豐,這裡分享一下學習心得,當然,C#中也差不多。     C++中引數的傳遞方式: 1.值傳遞     呼叫時,將實參的值傳遞對應的形參,即為值傳遞。由於形參有自己獨立的儲存

C#的方法傳參與switchif結構(4)

判斷 1.2 菱形 條件表達式 執行 代碼 輸出 分類 簡易 一、方法傳參的2種方式    1、按值傳遞       傳遞的是值的副本,值會更改但未保留,值最終並未更改     2、按引用傳遞(形參用ref關鍵字修飾)【P86頁】 傳遞的是地址,值會更改且保留,值最終更改

C++重載(overload)覆蓋(override)與隱藏(oversee)

acl 普通 evc dft war srx rpo 成員 avt body, table{font-family: 微軟雅黑; font-size: 10pt} table{border-col

C/C++陣列指標指標陣列函式指標變數的宣告和用法

#include <iostream> using namespace std; void fun1(int(*pArr)[3], int row) { int i,j; for (i = 0; i < row; i++) { for (j = 0; j <

C++class類 的 建構函式解構函式

說明: demo.cpp:main.cpp所在之處 Line.h:線段類的.h檔案 Line.cpp:線段類的.cpp檔案 Coordinate.h:座標類的.h檔案 Coordinate.cpp:

CC++經const修飾的常量常變數和普通變數的區別

1.在C89標準下的const const 修飾的型別是一個常變數,不能作為陣列的下標。常變數不能作為左值。 如: const int a = 10; int b = a; //其編譯的過程和一般變數編譯的過程相同 //並不會把引用符號的地方替換為對應的資

C++ main(char ** argv)的引數傳遞

1.首先字串常量,存在記憶體的靜態資料區,其本身的返回值,為char *型別,即指向該字串常量的指標; 2.正常情況下,宣告的main為(int argc,char *argv[ ]),其為指向字串的指標,將其改為char **argv後,argv指向char *,即arg

C++類成員函式的過載覆蓋和隱藏的區別,超清楚!

1.成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字可有可無。 2.覆蓋是指派生類函式覆蓋基類函式,特徵是: (1)不同的範圍(分別位於派生類與基類); (2)函式名字相同;

C#呼叫外部exe的使用呼叫powershell退出程序委託和事件

針對幾種情況,簡單總結學習一下竟然找到一個超級簡單的方法呼叫exe檔案程式碼就一句,並且呼叫的效果特別好。加上後面的.WaitForExit()就是為了等呼叫的程式執行完後再執行下面的程式碼,沒有後面的.WaitForExit() 無需等待程式完成後執行程式碼。System.

陣列與字串字元指標與其他型別指標引數指標引數以及引用引數函式指標

◆陣列和字串 從表面上看,一個字串就是一個字元陣列,但在C++語句中,兩者並不完全相同。 字串是一個以串尾符"\0"結尾的字元型陣列,但任一個字元型陣列不見得必為字串(因為其中可以不包含"\0"結尾字元)。 char string1[7]="China";char string2[]="China";ch

C#struct的位元組對齊轉換操作和複製為二進位制資料(byte[])

在做C#與其它程式通訊的系統時,往往會使用struc操作結構化的資料(如資料包等)。 本文簡要提出一些使用思路,歡迎各位大牛賜教。 一、STRUCT結構設計 當資料的結構確定時,總結為下面兩種情況: 1、資料長度確定(包括字串): 此時可以直接利用struct