日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > C語言與CPP編程
[導(dǎo)讀]1 引言 舉個例子:在func函數(shù)退出后,指針pInt所指的內(nèi)容*pInt為 12 #include? //公眾號:C語言與CPP編程 int?func(int*?pRes) { ????if(pRes?==?NULL) ????pRes?=?new?int(12);//分配新的內(nèi)存空間給指針pRes,并賦值? ????return?0; } int?main?() {

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í)參的傳遞使用了值傳遞方式,這種情況下,形參變量在函數(shù)體內(nèi)發(fā)生了變化,在函數(shù)結(jié)束之后,形參變量隨之釋放,不能把變化的結(jié)果返回給實(shí)參。

可以使用指針傳遞或者引用傳遞。想要在函數(shù)體內(nèi)改變pRes的值,并把這個變化返回到main函數(shù)中,必須傳遞pRes的指針。因?yàn)?code style="margin-right: 2px;margin-left: 2px;padding: 2px 4px;font-size: 14px;overflow-wrap: break-word;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">pRes本身就是指針,所以應(yīng)該傳遞指針的指針,或者指針的引用。

指針的引用

int v = 1;
int *p = &v;'
int *&rp = p;

&說明r是一個引用。*確定r引用的類型是一個指針。

因?yàn)橐貌皇菍ο?,故無引用的數(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)系

傳值:實(shí)參拷貝傳遞給形參。就是把實(shí)參賦值給形參,賦值完畢后實(shí)參就和形參沒有任何聯(lián)系,對形參的修改就不會影響到實(shí)參。

傳地址:把實(shí)參地址的拷貝傳遞給形參。就是把實(shí)參的地址復(fù)制給形參。復(fù)制完畢后實(shí)參的地址和形參的地址沒有任何聯(lián)系,對實(shí)參形參地址的修改不會影響到實(shí)參, 但是對形參地址所指向?qū)ο蟮男薷膮s直接反應(yīng)在實(shí)參中,因?yàn)樾螀⒅赶虻膶ο缶褪切螀⒌膶ο?/code>。

傳引用:本質(zhì)沒有任何實(shí)參的拷貝,兩個變量指向同一個對象。這是對形參的修改,必然反映到實(shí)參上。

  • 無論傳值還是傳指針,函數(shù)都會生成一個臨時變量,但傳引用時,不會生成臨時變量,
  • 傳值時,只可以引用值而不可以改變值,但傳值引用時,可以改變值,
  • 傳指針時,只可以改變指針?biāo)傅膬?nèi)容,不可以改變指針本身,但傳指針引用時,既可以改變指針?biāo)傅膬?nèi)容,又可以改變指針本身,
  • 引用傳遞函數(shù)的參數(shù),在內(nèi)存中并沒有產(chǎn)生實(shí)參的副本,它是直接對實(shí)參操作;而使用一般變量傳遞函數(shù)的參數(shù),當(dāng)發(fā)生函數(shù)調(diào)用時,需要給形參分配存儲單元,形參變量是實(shí)參變量的副本;如果傳遞的是對象,還將調(diào)用拷貝構(gòu)造函數(shù)。因此,當(dāng)參數(shù)傳遞的數(shù)據(jù)較大時,用引用比用一般變量傳遞參數(shù)的效率和所占空間都好。

參考書籍《C陷阱與缺陷》


點(diǎn)【在看】是最大的支持 

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉