函數的三種值傳遞方式


關於函數參數的傳遞方式

傳值參數:

實際參數的值被復制到由函數開辟的內存空間中,成為形參的初始值。完成參數值傳遞之后,函數體中的語句對形參的訪問、修改都是在這個標識對象上操作的,與實際參數無關。

實例:

#include<iostream>
#include<cstring>
using namespace std;
void swap(int ,int);
int main()
{
    int a, b;
    cin >> a >> b;
    cout << "a=" << a << " b=" << b << endl;
    swap(a, b);              
    cout << "a=" << a << " b=" << b << endl;
    system("pause");
}
void swap(int a, int b)             
{
    int temp = a;           
    a = b;
    b = temp;
    cout << "a=" << a << " b=" << b << endl;
}
View Code

輸出結果:

理解:輸入4,5,賦給a,b。調用函數swap,把a,b的值傳遞給函數中的形參,在swap函數中,輸出交換后的形參的值。然后再main函數中輸出a,b的值,發現a,b實際上並沒有交換值,這是因為swap函數只對形參進行操作。

 

指針參數:

指針傳遞本質上和值傳遞差不多,實際上是把實際的指針參數傳遞給函數中創建的形參指針。不同的地方在於,指針傳遞的情況時,可以通過再函數中通過形參指針的間址訪問對實際變量做出更改,這是值傳遞無法做到的。

代碼:

#include<iostream>
#include<cstring>
using namespace std;
void swap(int *, int *);
int main()
{
    int a, b;
    cin >> a >> b;
    cout << "a=" << a << " b=" << b << endl;
    swap(&a, &b);              //把a,b的地址傳遞給swap函數
    cout << "a=" << a << " b=" << b << endl;
    system("pause");
}
void swap(int *p, int *q)
{
    int temp = *p;            //通過指針簡直訪問,交換a,b的值
    *p = *q;
    *q = temp;
}
View Code

 

 引用參數:
與以上兩者不同的是函數調用時,形式參數不需要開辟新的存儲空間,形式參數名作為引用(別名)綁定與實際參數表示的對象上。執行函數體時,對形參的操作就是對實參對象操作。

 代碼:

#include<iostream>
#include<cstring>
using namespace std;
void swap(int &, int &);
int main()
{
    int a, b;
    cin >> a >> b;
    cout << "before swaping: ";
    cout << "a=" << a << " b=" << b << endl;
    swap(a, b);              //實際參數是整形變量名
    cout << "after swaping: ";
    cout << "a=" << a << " b=" << b << endl;
    system("pause");
}
void swap(int &p, int &q)    //形式參數是整形引用
{
    int temp = p;            //通過名訪問,交換a,b的值
    p = q;
    q = temp;
}

使用const引用參數:

#include<iostream>
#include<cstring>
using namespace std;
void swap(const int &,const int &);
int main()
{
    int a = 2, b = 55;
    cout << a << " " << b << endl;
    swap(a, b);
    cout << a << " " << b;
}
void swap(const int &a, const int &b)
{
    int temp = a;  
    a = b;      //非法操作a所綁定的對象被約束為只讀,無法通過別名對該對象進行修改
    b = temp;
}

與上述類似,使用const關鍵字約束對指針變量所指向對象的訪問,這種指針稱為指向常量指針。
如:

int a=2,b=3;

const int *p1=&a;       //聲明一個指向常量的指針並給指針初始化

const int *p2;

 p2=&b;      //可以通過,因為指向常量的指針只對指針所指向的對象進行約束,並不對指針本身進行約束,所以可以先聲明,后賦值

*p1=3;        //非法,無法通過p1間接對a進行修改

a=3;         //合法,a是int型變量,可以修改

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM