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#中的方法傳參與switch、if結構(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:
C和C++中經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