<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          指針變量的傳值和傳址

          共 1675字,需瀏覽 4分鐘

           ·

          2020-08-13 12:17

          1 引言

          舉個(gè)例子:在func函數(shù)退出后,指針pInt所指的內(nèi)容*pInt為 12

          #include?
          //公眾號(hào):C語(yǔ)言與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)用過(guò)程中,形參和實(shí)參的傳遞使用了值傳遞方式,這種情況下,形參變量在函數(shù)體內(nèi)發(fā)生了變化,在函數(shù)結(jié)束之后,形參變量隨之釋放,不能把變化的結(jié)果返回給實(shí)參。

          可以使用指針傳遞或者引用傳遞。想要在函數(shù)體內(nèi)改變pRes的值,并把這個(gè)變化返回到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;

          &說(shuō)明r是一個(gè)引用。*確定r引用的類型是一個(gè)指針。

          因?yàn)橐貌皇菍?duì)象,故無(wú)引用的數(shù)組,無(wú)指向引用的指針,無(wú)到引用的引用:

          int&?a[5];?//?錯(cuò)誤
          int&*?p;???//?錯(cuò)誤
          int&?&r;???//?錯(cuò)誤

          所以修改函數(shù)int func(int* pRes);int func(int *&pRes);

          #include?

          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)系,對(duì)形參的修改就不會(huì)影響到實(shí)參。

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

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

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

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


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

          瀏覽 48
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  男女黄色在线观看 | 人妻巨大乳一二三区 | 天天视频黄色 | 日韩成人激情 | 精品视频一区二区三区 |