C++中函数调用时的三种参数传递方式(x,*x,x)
先看三種方式實現函數中參數傳遞的實例程序
- 輸入描述:兩個待交換的整數
- 程序輸出:交換后得按值傳遞兩個整數
- (一)按值傳遞:按值傳遞的過程為:首先計算出實參表達式的值,接著給對應的形參變量分配一個存儲空間,該空間的大小等于該形參類型的,然后把以求出的實參表達式的值一一存入到形參變量分配的存儲空間中,成為形參變量的初值,供被調用函數執行時使用。這種傳遞是把實參表達式的值傳送給對應的形參變量,故稱這種傳遞方式為“按值傳遞”。
- #include<stdio.h> void myswap(int x, int y) {int t;t=x;x=y;y=t; } int main() {int a, b;printf("請輸入待交換的兩個整數:");scanf("%d %d", &a, &b);myswap(a,b); //作為對比,直接交換兩個整數,顯然不行printf("調用交換函數后的結果是:%d 和 %d\n", a, b);return 0; }
(二) 地址傳遞:如果在函數定義時將形參說明成指針,對這樣的函數進行調用時就需要指定地址值形式的實參。這時的參數傳遞方式就是地址傳遞方式。
#include<stdio.h> void myswap(int *p1, int *p2) {int t;t=*p1;*p1=*p2;*p2=t; } int main() {int a, b;printf("請輸入待交換的兩個整數:");scanf("%d %d", &a, &b);myswap(&a,&b); //交換兩個整數的地址printf("調用交換函數后的結果是:%d 和 %d\n", a, b);return 0; }引用傳遞:如果以引用為參數,則可以使得對形參的任何操作都能改變相應的數據
#include<stdio.h> void myswap(int &x, int &y) {int t;t=x;x=y;y=t; }int main() {int a, b;printf("請輸入待交換的兩個整數:");scanf("%d %d", &a, &b);myswap(a,b); //直接以變量a和b作為實參交換printf("調用交換函數后的結果是:%d 和 %d\n", a, b);return 0; }結果
按值傳遞: 請輸入待交換的兩個整數:2 3 調用交換函數后的結果是:2 和 3 地址傳遞: 請輸入待交換的兩個整數:2 3 調用交換函數后的結果是:3 和 2 引用傳遞: 請輸入待交換的兩個整數:2 3 調用交換函數后的結果是:3 和 2知識點總結:
在第一個程序中,按值傳遞:傳值不成功的原因是指在形參上改變了數值,沒有在實參上改變數值。
在第二個程序中,地址傳遞(指針傳遞):傳地址成功的原因利用指針改變了原來的地址,所以實參就交換了。
在第三個程序中,引用傳遞:引用是直接改變兩個實參變量a,b的值,所以就交換了。
實參sum(a,b) ? ? 形參sum(int a,int b)或者sum(int &a,int &b)
實參sum(&a,&b) ? ? ? ?形參sum(int *a,int *b)
關鍵點:在函數中,編譯器總是要為函數的每個參數制作臨時副本。引用傳遞除外。
? ? ?從功能上。按值傳遞在傳遞的時候,實參被復制了一份,然后在函數體內使用,函數體內修改參數變量時修改的是實參的一份拷貝,而實參本身是沒有改變的,所以如果想在調用的函數中修改實參的值,使用值傳遞是不能達到目的的,這時只能使用引用或指針傳遞。例如,要實現兩個數值交換。
一.值傳遞。
值傳遞很簡單。唯一要注意的就是當值傳遞的輸入參數是用戶自定義類型時,最好用引用傳遞代替,并加上const關鍵字。因為引用傳遞省去了臨時對象的構造和析構(見關鍵點)。
數據類型為內部類型時,不必。使用這種方式,調用函數本身不對實參進行操作,也就是說,即使形參的值在函數中發生了變化,實參的值也完全不會受到影響,仍為調用前的值。
二。指針傳遞地址傳遞與按值傳遞的不同在于,它把實參的存儲地址傳送給對應的形參,從而使得形參指針和實參指針指向同一個地址。因此,被調用函數中對形參指針所指向的地址中內容的任何改變都會影響到實參。
三.引用傳遞。
C++區別于C的一個新增優勢。雖然用&作為標識符,但是跟指針一點關系都沒有。
int &a=b表示,a和b是同一個變量。簡單地說,相當于一個別名,如:Stephen Chow和周星馳。
當作為參數傳遞時,它省去了臨時對象的構造和析構。
?const關鍵字。當你的參數是作為輸入參數時,你總不希望你的輸入參數被修改,否則有可能產生邏輯錯誤,這時可以在聲明函數時在參數前加上const關鍵字,防止在實現時意外修改函數輸入,對于使用你的代碼的程序員也可以告訴他們這個參數是輸入,而不加const關鍵字的參數也可能是輸出。
總結
以上是生活随笔為你收集整理的C++中函数调用时的三种参数传递方式(x,*x,x)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 膝盖超伸什么意思
- 下一篇: Compound Words UVA -