指針變量的傳值和傳址
掃描二維碼
隨時隨地手機看文章
1 引言
舉個例子:在func
函數(shù)退出后,指針pInt
所指的內(nèi)容*pInt
為 12
#include <stdio.h>
//公眾號:C語言與CPP編程
int func(int* pRes)
{
if(pRes == NULL)
pRes = new int(12);//分配新的內(nèi)存空間給指針pRes,并賦值
return 0;
}
int main ()
{
int *pInt = NULL;
int val = func(pInt);
printf("%d\n",*pInt); return 0;
}
解析:int func(int* pRes)
函數(shù)的形參是指針類型 int *pRes
,在函數(shù)體中 new
了一塊內(nèi)存并賦值 12,將內(nèi)存地址賦值給指針 pRes
。在main
函數(shù)中,定義了指針pInt
,調(diào)用func
函數(shù),把pInt
作為參數(shù)傳入func
函數(shù)中。結(jié)果*pInt
并不是 12。
原因:在func
函數(shù)調(diào)用過程中,形參和實參的傳遞使用了值傳遞
方式,這種情況下,形參變量在函數(shù)體內(nèi)
發(fā)生了變化,在函數(shù)結(jié)束之后,形參變量隨之釋放
,不能把變化的結(jié)果返回給實參。
可以使用指針傳遞
或者引用傳遞
。想要在函數(shù)體內(nèi)改變pRes
的值,并把這個變化返回到main
函數(shù)中,必須傳遞pRes
的指針。因為pRes
本身就是指針,所以應(yīng)該傳遞指針的指針
,或者指針的引用
。
指針的引用
int v = 1;
int *p = &v;'
int *&rp = p;
&
說明r
是一個引用。*
確定r
引用的類型是一個指針。
因為引用不是對象,故無引用的數(shù)組,無指向引用的指針,無到引用的引用:
int& a[5]; // 錯誤
int&* p; // 錯誤
int& &r; // 錯誤
所以修改函數(shù)int func(int* pRes);
為int func(int *&pRes);
#include <stdio.h>
int func(int* &pRes)
{
if(pRes == NULL)
pRes = new int(12);//分配新的內(nèi)存空間給指針pRes,并賦值
return 0;
}
int main ()
{
int *pInt = NULL;
int val = func(pInt);
printf("%d\n",*pInt);
return 0;
}
2 傳值、傳引用區(qū)別和聯(lián)系
傳值:實參拷貝傳遞給形參。就是把實參賦值給形參,賦值完畢后實參就和形參沒有任何聯(lián)系,對形參的修改就不會影響到實參。
傳地址:把實參地址的拷貝傳遞給形參。就是把實參的地址復(fù)制給形參。復(fù)制完畢后實參的地址和形參的地址沒有任何聯(lián)系,對實參形參地址的修改不會影響到實參, 但是對形參地址所指向?qū)ο蟮男薷膮s直接反應(yīng)在實參中,因為形參指向的對象就是形參的對象
。
傳引用:本質(zhì)沒有任何實參的拷貝,兩個變量指向同一個對象。這是對形參的修改,必然反映到實參上。
-
無論傳值還是傳指針,函數(shù)都會生成一個臨時變量,但傳引用時,不會生成臨時變量, -
傳值時,只可以引用值而不可以改變值,但傳值引用時,可以改變值, -
傳指針時,只可以改變指針所指的內(nèi)容,不可以改變指針本身,但傳指針引用時,既可以改變指針所指的內(nèi)容,又可以改變指針本身, -
引用傳遞函數(shù)的參數(shù),在內(nèi)存中并沒有產(chǎn)生實參的副本,它是直接對實參操作;而使用一般變量傳遞函數(shù)的參數(shù),當發(fā)生函數(shù)調(diào)用時,需要給形參分配存儲單元,形參變量是實參變量的副本;如果傳遞的是對象,還將調(diào)用拷貝構(gòu)造函數(shù)。因此,當參數(shù)傳遞的數(shù)據(jù)較大時,用引用比用一般變量傳遞參數(shù)的效率和所占空間都好。
參考書籍《C陷阱與缺陷》
點【在看】是最大的支持
免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!