C++函式呼叫之——值傳遞、指標傳遞、引用傳遞
阿新 • • 發佈:2021-07-30
1、簡介
1、值傳遞:形參時實參的拷貝,改變函式形參並不影響函式外部的實參,這是最常用的一種傳遞方式,也是最簡單的一種傳遞方式。只需要傳遞引數,返回值是return考慮的;使用值傳遞這種方式,呼叫函式不對實參進行操作,也就是說,即使形參的值發生改變,實參的值也完全不受影響。
2、指標傳遞:指標傳遞其實是值傳遞的一種,它傳遞的是地址。值傳遞過程中,被調函式的形參作為被調函式的區域性變數來處理,即在函式的棧中有開闢了記憶體空間來存放主調函式放進來實參的值,從而成為一個副本。因為指標傳遞的是外部引數的地址,當呼叫函式的形參發生改變時,自然外部實參也發生改變。
3、引用傳遞:被調函式的形參雖然也作為區域性變數在棧中開闢了記憶體空間,但在棧中放的是由主調函式放進來的實參變數的地址。被調函式對形參的任何操作都被間接定址,即通過棧中的存放的地址訪問主調函式中的中的實參變數(相當於一個人有兩個名字),因此形參在任意改動都直接影響到實參。
2、例程
1、值傳遞
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream>
using namespace std;
void swap( int , int );
int main()
{
int a=1,b=2;
cout<< "a=" <<a<< ",b=" <<b<<endl;
swap(a,b);
cout<< "a=" <<a<< ",b=" <<b<<endl;
return 0;
}
void swap( int x, int y)
{
int p=x;
x=y;
y=p;
}
|
2、指標傳遞
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <iostream>
using namespace std;
void swap( int *x, int *y);
int main()
{
int a=1,b=2;
cout<< "a=" <<a<< ",b=" <<b<<endl;
cout<< "&a=" <<&a<< ",&b=" <<&b<<endl;
cout<< "********1**********" <<endl;
swap(&a,&b);
cout<< "a=" <<a<< ",b=" <<b<<endl;
cout<< "&a=" <<&a<< ",&b=" <<&b<<endl;
cout<< "********3**********" <<endl;
return 0;
}
void swap( int *x, int *y)
{
int p=*x; //int p; p=*x;
*x=*y;
*y=p;
cout<< "x=" <<x<< ",y=" <<y<<endl;
cout<< "*x=" <<*x<< ",*y=" <<*y<<endl;
cout<< "&x=" <<&x<< ",&y=" <<&y<<endl;
cout<< "********2**********" <<endl;
}
|
int *x=&a;//用於指標傳遞,x有自己獨立的記憶體地址,儲存內容是a的地址,*x是存a的值。
根據圖1 可知:x(y)是一個指向外部實參地址的指標,*x(*y)是指標的內容,如果改變了*x(*y)也必然導致外部實參的改變。
這是因為x或y的指標指向a或b的地址,因此*x*y值的交換導致外部實參發生變化。
3、引用傳遞
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <iostream>
using namespace std;
void swap( int &x, int &y);
int main()
{
int a=1,b=2;
cout<< "a=" <<a<< ",b=" <<b<<endl;
cout<< "&a=" <<&a<< ",&b=" <<&b<<endl;
cout << "*******1**********" <<endl;
swap(a,b);
cout<< "a=" <<a<< ",b=" <<b<<endl;
cout<< "&a=" <<&a<< ",&b=" <<&b<<endl;
cout << "*******4**********" <<endl;
return 0;
}
void swap( int &x, int &y)
{
cout<< "x=" <<x<< ",y=" <<y<<endl;
cout<< "&x=" <<&x<< ",&y=" <<&y<<endl;
cout << "*******2**********" <<endl;
int p=x;
x=y;
y=p;
cout<< "x=" <<x<< ",y=" <<y<<endl;
cout<< "&x=" <<&x<< ",&y=" <<&y<<endl;
cout << "*******3**********" <<endl;
}
|
引用實參和形參時一樣的,只是名字不同而已。
原文地址https://www.cnblogs.com/happying30/p/9484860.html