C++引數的傳遞方式
C++引數的傳遞方式
————————————————————————供記憶學習和理解
1. 值傳遞
· 呼叫時,將實參的值傳遞給對應的形參。由於形參有自己獨立的儲存空間,又作為函式的區域性變數,故在函式中對任何形參值的修改,都不會改變實參變數的值。
· 典型的例子如下:
#include <iostream>
using namespace std;
void swap(int,int);
int main()
{
int a = 1;
int b = 2;
cout << "交換前 a = " << a << "\tb = "<< b << endl;
swap(a,b);
cout << "交換後 a = " << a << "\tb = "<< b << endl;
return 0;
}
void swap(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
cout << "交換函式swap內部 a = " << x <<"\tb = "<< y << endl;
}
//結果
交換前 a = 1 b = 2
交換函式swap內部 a = 2 b = 1
交換後 a = 1 b = 2
由上可知,主函式內全域性變數的a,b在執行函式swap呼叫後a和b值都沒有改變,只是在函式內部作了交換。
分析函式呼叫的過程:
(a)呼叫前,a、b有自己的儲存空間和初始值;
(b)呼叫時,為形參x、y分配了儲存空間,並將實參a、b的值一一對應過來,在函式執行過程中將x、y的值互換;
(c)呼叫結束後,x、y的儲存空間被釋放,a、b的值沒有影響
2. 引用傳遞
· 引用是一種特殊的變數,可認為是一個變數的別名。
· 定義引用變數的語法如下:
資料型別 & 引用名 = 變數名;
· 引用變數並不分配獨立的儲存空間,與所對應的變數共用同一個記憶體空間;定義時如果該引用變數不是作為函式的引數或返回值時,必須初始化,即提供所要引用的變數名。
· 以上例進行對比舉例如下:
#include <iostream>
using namespace std;
void swap(int&,int&);
int main()
{
int a = 1;
int b = 2;
cout << "交換前 a = " << a << "\tb = "<< b << endl;
swap(a,b);
cout << "交換後 a = " << a << "\tb = "<< b << endl;
return 0;
}
void swap(int& x, int& y) // 函式引數列表中定義了兩個引用變數x、y
{
int temp;
temp = x;
x = y;
y = temp;
cout << "交換函式swap內部 a = " << x <<"\tb = "<< y << endl;
}
//結果如下
交換前 a = 1 b = 2
交換函式swap內部 a = 2 b = 1
交換後 a = 2 b = 1
結果說明在函式swap呼叫過後,實參的值被改變。由此推斷,在函式呼叫時,作為形參的引用變數並不分配新的儲存空間,它將作為實參變數的別名和實參共用同一個記憶體空間,提高了執行效率。
故此,使用引用引數可以直接操作實參變數從而實現通過修改形參值而達到修改對應實參的目的。
3. 指標變數傳遞
採用指標變數作為函式的引數進行傳遞,所傳遞的是對應的地址。
3.1 形參變化影響實參的情況
#include <iostream>
using namespace std;
void swap(int* x,int* y);
int main()
{
int a = 1, b = 2;
int *p1 = &a, *p2 = &b; //定義兩個指標變數,分別指向a、b,由於a、b中的值為int,故指標變數也為int. & 為取變數地址的操作符
cout << "交換前 a = " << a << "\tb = "<< b << endl;
swap(p1,p2);
cout << "交換後 a = " << a << "\tb = "<< b << endl;
return 0;
}
void swap(int* x, int* y) // 函式引數列表中定義了兩個指標變數x、y
{
int temp;
temp = *x; // 取指標變數x的值(地址)所對應的變數的值,並賦值給temp
*x = *y;
*y = temp;
cout << "交換函式swap內部 a = " << *x <<"\tb = "<< *y << endl;
}
//結果
交換前 a = 1 b = 2
交換函式swap內部 a = 2 b = 1
交換後 a = 2 b = 1
可見,函式呼叫時,p1、p2作為指向a、b的指標傳遞給對應的函式形參,在函式內部通過* 得到指標變數的地址所對應的值並進行交換,從而改變了實參的值。
3.2 形參變化不影響實參的情況
#include <iostream>
using namespace std;
void swap(int* x,int* y);
int main()
{
int a = 1, b = 2;
int *p1 = &a, *p2 = &b; //定義兩個指標變數,分別指向a、b,由於a、b中的值為int,故指標變數也為int. & 為取變數地址的操作符
cout << "交換前 a = " << a << "\tb = "<< b << endl;
swap(p1,p2);
cout << "交換後 a = " << a << "\tb = "<< b << endl;
return 0;
}
void swap(int* x, int* y) // 函式引數列表中定義了兩個指標變數x、y
{
int *temp; // 定義了一個指標變數
temp = x; // 以下是對地址進行了交換
x = y;
y = temp;
cout << "交換函式swap內部 a = " << *x <<"\tb = "<< *y << endl;
}
交換前 a = 1a的地址:000000633B0FF7A4 b = 2b的地址:000000633B0FF7C4
交換函式swap內部 a = 2 b = 1
交換後 a = 1a的地址:000000633B0FF7A4 b = 2b的地址:000000633B0FF7C4
結果可見,函式呼叫後a、b的值並未改變,包括地址值。在函式呼叫時,在函式內部首先為a、b的地址,即為x、y開闢了新的儲存空間,並作了交換,於是函式內部a、b的值發生了互換。在函式呼叫後,x、y的儲存空間被釋放,但並不影響a、b的值
相關文章
- java 傳遞引數的兩種方式Java
- 引數傳遞方式必須是const引用傳遞
- c++ -- 二維陣列引數傳遞C++陣列
- ABAP 方法呼叫的引數傳遞裡,透過引用傳遞的方式,能修改原始引數值嗎?
- 引數傳遞
- JS的方法引數傳遞(按值傳遞)JS
- Js傳遞陣列引數到後臺controller的方式JS陣列Controller
- 引數的定義和引數的傳遞
- Mybatis引數傳遞MyBatis
- 請求引數的傳遞
- 函式的引數傳遞函式
- React事件傳遞引數React事件
- 路由元件傳遞引數路由元件
- Java中將方法作為引數傳遞5種方式Java
- 使用python指令碼傳遞引數:(三種方式可收藏)Python指令碼
- Python的函式引數傳遞:傳值?引用?Python函式
- Shell學習【引數傳遞】
- linux中main引數傳遞LinuxAI
- 利用閉包傳遞引數
- JavaScript函式傳遞引數JavaScript函式
- out,ref,params引數傳遞
- t-on-click 傳遞引數
- GridView傳遞兩個引數的方法View
- python中函式的引數傳遞Python函式
- C++ 預設引數與引用傳遞:語法、用法及示例C++
- C,C++中如何向main(int argc , char argv[])傳遞引數C++AIGC
- php函式之如何用預設引數和可變長度引數方式傳遞?PHP函式
- 面試官問:Go 中的引數傳遞是值傳遞還是引用傳遞?面試Go
- 函式作為引數傳遞函式
- [Python] 傳遞引數前面的*或**Python
- 引數傳遞機制之JWTJWT
- JAVA基礎之-引數傳遞Java
- 函式引數傳遞及返回函式
- Python怎麼傳遞不定引數Python
- JavaScript獲取url傳遞的引數值JavaScript
- php函式引用傳遞引數的方法PHP函式
- c++單例模式、常量成員函式、引數傳遞、友元C++單例模式函式
- Java方法04:命令列傳遞引數、可變引數Java命令列