值傳遞
- 值傳遞是指在調(diào)用函數(shù)時將實際參數(shù)復(fù)制一份傳遞到函數(shù)中,這樣在函數(shù)中如果對參數(shù)進行修改,將不會影響到實際參數(shù)。
- 在函數(shù)結(jié)束返回后,形參被丟棄釋放,實參的內(nèi)容不會被改變
數(shù)據(jù)值傳遞和地址值傳遞
-
數(shù)據(jù)值傳遞
//C語言的數(shù)據(jù)值傳遞 #include<stdio.h> int fun(int a) { a = 3; //對a進行改變 printf("fun's a is:%d\n",a); return 1; } int main() { int a = 1; printf("main's original a is:%d\n",a); fun(a); //調(diào)用fun(int ) printf("main's a is:%d",a); return 0; }

-
地址值傳遞
//C語言的地址值傳遞(實例一) #include<stdio.h> int fun(int* p) { *p = 3; //對p指向的數(shù)據(jù)(main's a)進行了改變 return 1; } int main() { int a = 1; int* p = &a; //初始化指針并指向a printf("main's original a is:%d\n",a); fun(p); //調(diào)用fun(int* ) printf("main's a is:%d",a); return 0; }

//C語言的地址值傳遞(更揭示值傳遞實質(zhì))(實例二)
#include<stdio.h>
int fun(int* p)
{
p++; //對傳過來的地址值進行更改
printf("fun's p is:%d\n",p);
return 1;
}
int main()
{
int a = 1;
int* p = &a; //初始化指針并指向a
printf("main's original p is:%d\n",p);
fun(p); //調(diào)用fun(int* )
printf("main's p is:%d",p);
return 0;
}

地址值傳遞總結(jié):
第一個實例常用;第二個不常用,但更加揭示值傳遞的實質(zhì)。
通過地址值傳遞可以實現(xiàn)被調(diào)用的函數(shù)中的數(shù)據(jù)變更影響到全局(實例一),不同函數(shù)可以共同維護和使用同一內(nèi)存塊兒的數(shù)據(jù)。
地址值傳遞實質(zhì)是值傳遞,不同于數(shù)據(jù)值傳遞的是地址值復(fù)制到被調(diào)用的函數(shù)中后通常不加改變和參與運算,而是直接取用其指向的數(shù)據(jù),來修改和運算。(取用方式:*p)
引用傳遞
在C++中,函數(shù)參數(shù)的傳遞方式有引用傳遞。所謂引用傳遞是指在調(diào)用函數(shù)時自動將實際參數(shù)的地址傳遞到函數(shù)中,并作為局部變量在堆棧中開辟內(nèi)存空間,被調(diào)函數(shù)對形參的任何操作都被處理成間接尋址,即通過堆棧中存放的地址訪問主調(diào)函數(shù)中的實參變量。那么在函數(shù)中對參數(shù)所進行的修改,將影響到實際參數(shù)。
//C++引用傳遞
#include<iostream>
using namespace std;
int fun(int& b)//參數(shù)定義為一個整型引用
{
b = 88; //修改形參b的值
cout << "fun's b is:" << b << endl;
}
int main()
{
int a = 1;
cout << "main's original a is:" << a << endl;
fun(a); //調(diào)用fun(int& )
cout << "main's a is:" << a << endl;
return 0;
}

辨析
- 值傳遞是直接傳遞實際參數(shù)的值到形參,相當(dāng)于copy, 實參和形參分別占用不同的相同大小的存儲單元,對形參的操作并不影響實參
- 引用傳遞是傳遞實際參數(shù)的地址值到形參,形參作為局部變量在堆棧中開辟了內(nèi)存空間,接收實參的地址值存放,被調(diào)函數(shù)對形參的所有操作都被處理為間接尋址,即通過堆棧中存放的地址訪問主調(diào)函數(shù)中的實參變量,此時對形參的所有操作即是對實參的操作
本文借鑒/推薦參考
值傳遞 引用傳遞(傳地址,傳引用)的區(qū)別 ------無限