0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

c++引用詳細(xì)解說2

jf_78858299 ? 來源:阿Q正磚 ? 作者:阿Q正磚 ? 2023-02-15 09:43 ? 次閱讀

5、應(yīng)用

  1. 參數(shù)

我們知道實(shí)參的改變不影響形參,所以這種寫法并不能改變值,因?yàn)榇丝淌?傳值調(diào)用 :

圖片

按照之前 c 的寫法,我們使用 傳址調(diào)用 ,用指針修改:

圖片

但是學(xué)習(xí)引用之后,完全可以用引用修改:

圖片

x 和 y 分別是 a 和 b 的引用,對 x 和 y 進(jìn)行修改,就是對 a 和 b 進(jìn)行修改,所以值也被修改成功了。

調(diào)試一下:

它們的地址是完全相同的。而這里這里既不是傳值調(diào)用,也不是傳址調(diào)用,而是傳引用調(diào)用。

思考:上面三個(gè)函數(shù)是否構(gòu)成函數(shù)重載?構(gòu)成,但無法調(diào)用。

根據(jù)函數(shù)名修飾規(guī)則,傳值和傳引用的是不一樣的,比如會(huì)加上 R 做區(qū)分。

但是不能同時(shí)調(diào)用傳值和傳引用,因?yàn)橛衅缌x,就會(huì)導(dǎo)致調(diào)用不明確 ,編譯器并不知道調(diào)用哪個(gè):

圖片

引用解決二級指針生澀難懂的問題 :

講單鏈表時(shí),我們寫的由于是沒有頭結(jié)點(diǎn)的鏈表,所以修改時(shí),需要二級指針,對于指針概念不清晰的小伙伴們可能比較難理解。

但是學(xué)了引用,就可以解決這個(gè)問題:

結(jié)構(gòu)定義:

typedef structSListNode{            int data;            struct SListNode* next;}SLTNode;

原代碼:

void SListPushFront(SLTNode** pphead, SLTDateType x){    SLTNode* newnode = BuyListNode(x);    newnode->next = *pphead;     *pphead = newnode;}// 調(diào)用SLTNode* pilst = NULL;SListPushFront(&plist);

修改后:

void SListPushFront(SLTNode*& pphead, SLTDateType x) // 改{            SLTNode* newnode = BuyListNode(x);            newnode->next = *pphead;             *pphead = newnode;}// 調(diào)用SLTNode* pilst = NULL;SListPushFront(plist); // 改

修改之后的代碼里的二級指針被替換成了引用。

而這里的意思就是給一級指針取了一個(gè)別名,傳過來的是plist,而plist 是一個(gè)一級指針,所以會(huì)出現(xiàn) * ,而這里就相當(dāng)于 pphead 是 plist 的別名。而這里修改 pphead ,也就可以對 plist 完成修改。

但是有時(shí)候也會(huì)這么寫 :

結(jié)構(gòu)改造:

typedef structSListNode{            int data;            struct SListNode* next;}SLTNode, *PSLTNode;

這里的意思就是將 struct SListNode* 類型重命名為 PSLTNode

代碼:

void SListPushFront(PSLTNode& pphead, SLTDateType x) // 改{            PSLTNode newnode = BuyListNode(x);            newnode->next = pphead;             pphead = newnode;}// 調(diào)用 PSLTNode plist = NULL;SListPushFront(plist);

typedef 之后,PSLTNode 就是結(jié)構(gòu)體指針,所以傳參過去,只需要在形參那邊用引用接收,隨后進(jìn)行操作,就可以達(dá)成目的。

而形參的改變影響實(shí)參的參數(shù)叫做輸出型參數(shù),對于輸出型參數(shù),使用引用就十分舒適。

如果了解引用,那么這一部分是相當(dāng)好理解的,一些數(shù)據(jù)結(jié)構(gòu)教科書上也是這么寫的,但是如果不懂引用,甚至?xí)X得比二級指針還難以理解。

在我們學(xué)習(xí)了引用之后,之后也可以這么寫代碼,更加方便。

  1. 做返回值

要搞清楚這一塊,我們先進(jìn)行些許鋪墊。

int add(int a, int b){            int c = a + b;            return c;}
int main(){ int ret = add(1, 2); cout << ret << endl; return 0;}

這里看似很簡單,就是把a(bǔ)dd函數(shù)計(jì)算結(jié)束的結(jié)果返回,但是這里包含了 傳值返回 。

若從棧幀角度看,會(huì)先創(chuàng)建 main 函數(shù)的棧幀,里面就會(huì)有 call 指令,開始調(diào)用 add 函數(shù)。而 add 函數(shù)也會(huì)形成棧幀,而棧幀中也有兩塊小空間,用來接受參數(shù),分別為 a 和 b,而里面的 c 則用來計(jì)算結(jié)果并返回。

圖片

而對于傳值返回,返回的并不是 c ,而是返回的是 c 的拷貝。而這其中會(huì)有一個(gè)臨時(shí)變量,返回的是臨時(shí)變量(見函數(shù)棧幀)

如果返回的是 c 的話,由于 add 的函數(shù)棧幀已經(jīng)銷毀了,就會(huì)產(chǎn)生很多奇怪的問題。c 能不能取到都是未知,而這時(shí)都是非法訪問,因?yàn)榭臻g已經(jīng)被歸還給系統(tǒng)了,所以必定是c拷貝后的數(shù)據(jù)被返回。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
收藏 人收藏

    評論

    相關(guān)推薦

    Visual C++教程之C++的語言資料概述免費(fèi)下載

    本文檔詳細(xì)介紹的是Visual C++教程之C++的語言資料概述免費(fèi)下載主要內(nèi)容包括了:1 從CC++的程序結(jié)構(gòu) ,
    發(fā)表于 02-15 15:59 ?3次下載
    Visual <b class='flag-5'>C++</b>教程之<b class='flag-5'>C++</b>的語言資料概述免費(fèi)下載

    C++程序設(shè)計(jì)教程之?dāng)?shù)據(jù)類型的詳細(xì)資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是C++程序設(shè)計(jì)教程之?dāng)?shù)據(jù)類型的詳細(xì)資料說明。1. 整型 ( int Types ) , 2.整型子類 ( sub-int Types ) , 3.浮點(diǎn)型
    發(fā)表于 02-21 17:18 ?3次下載
    <b class='flag-5'>C++</b>程序設(shè)計(jì)教程之?dāng)?shù)據(jù)類型的<b class='flag-5'>詳細(xì)</b>資料說明

    C++程序設(shè)計(jì)教程之C++的初步知識的詳細(xì)資料說明

    C++程序設(shè)計(jì)教程之C++的初步知識的詳細(xì)資料說明包括了:1. 從CC++2 . 最簡單的
    發(fā)表于 03-14 14:48 ?31次下載
    <b class='flag-5'>C++</b>程序設(shè)計(jì)教程之<b class='flag-5'>C++</b>的初步知識的<b class='flag-5'>詳細(xì)</b>資料說明

    C++程序設(shè)計(jì)教程之?dāng)?shù)組的詳細(xì)資料說明

    本文檔詳細(xì)介紹的是C++程序設(shè)計(jì)教程之?dāng)?shù)組的詳細(xì)資料說明主要內(nèi)容包括了:1. 數(shù)組的概念,2. 一維數(shù)組的定義和引用,3. 二維數(shù)組的定義和
    發(fā)表于 03-14 14:48 ?10次下載
    <b class='flag-5'>C++</b>程序設(shè)計(jì)教程之?dāng)?shù)組的<b class='flag-5'>詳細(xì)</b>資料說明

    C++程序設(shè)計(jì)教程之指針的詳細(xì)資料說明

    本文檔詳細(xì)介紹的是C++程序設(shè)計(jì)教程之指針的詳細(xì)資料說明主要內(nèi)容包括了:1. 指針的概念,2. 變量與指針,3. 數(shù)組與指針,4. 字符串與指針,5. 函數(shù)與指針,6. 返回指針值的函
    發(fā)表于 03-14 16:04 ?7次下載
    <b class='flag-5'>C++</b>程序設(shè)計(jì)教程之指針的<b class='flag-5'>詳細(xì)</b>資料說明

    C++程序設(shè)計(jì)教程之C++工具的詳細(xì)資料說明

    本文檔的詳細(xì)介紹的是C++程序設(shè)計(jì)教程之C++工具的詳細(xì)資料說明主要內(nèi)容包括了:1. 異常處理,2. 命名空間,3. 使用早期的函數(shù)庫
    發(fā)表于 03-14 16:39 ?4次下載
    <b class='flag-5'>C++</b>程序設(shè)計(jì)教程之<b class='flag-5'>C++</b>工具的<b class='flag-5'>詳細(xì)</b>資料說明

    C++程序設(shè)計(jì)的基礎(chǔ)知識初步了解C++的資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是C++程序設(shè)計(jì)的基礎(chǔ)知識初步了解C++的資料免費(fèi)下載包括了:1 認(rèn)識C++,2
    發(fā)表于 06-10 08:00 ?25次下載
    <b class='flag-5'>C++</b>程序設(shè)計(jì)的基礎(chǔ)知識初步了解<b class='flag-5'>C++</b>的資料免費(fèi)下載

    C++引用的使用場景

    C++引用的使用場景
    的頭像 發(fā)表于 06-29 15:18 ?4068次閱讀
    <b class='flag-5'>C++</b>:<b class='flag-5'>引用</b>的使用場景

    C++中的const和引用的討論

    今天給大家分享一下這段時(shí)間學(xué)習(xí)c++的總結(jié)學(xué)習(xí):c++里面的const關(guān)鍵字和引用。
    的頭像 發(fā)表于 12-24 15:35 ?852次閱讀

    C語言和C++的特點(diǎn)與用法詳細(xì)說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是C語言和C++的特點(diǎn)與用法詳細(xì)說明。
    的頭像 發(fā)表于 12-26 10:58 ?4421次閱讀

    C++基礎(chǔ)語法中的引用、封裝和多態(tài)

    本期是C++基礎(chǔ)語法分享的第六節(jié),今天給大家來分享一下: (1)引用; (2)宏; (3)成員初始化列表; (4)封裝; (5)繼承; (6)多態(tài); 引用 左值
    的頭像 發(fā)表于 09-12 09:58 ?1315次閱讀

    c++引用詳細(xì)解說1

    C++C語言的繼承,它可進(jìn)行過程化程序設(shè)計(jì),又可以進(jìn)行以抽象數(shù)據(jù)類型為特點(diǎn)的基于對象的程序設(shè)計(jì),還可以進(jìn)行以繼承和多態(tài)為特點(diǎn)的面向?qū)ο蟮某绦蛟O(shè)計(jì)。
    的頭像 發(fā)表于 02-15 09:40 ?589次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b><b class='flag-5'>詳細(xì)</b><b class='flag-5'>解說</b>1

    c++引用詳細(xì)解說3

    C++C語言的繼承,它可進(jìn)行過程化程序設(shè)計(jì),又可以進(jìn)行以抽象數(shù)據(jù)類型為特點(diǎn)的基于對象的程序設(shè)計(jì),還可以進(jìn)行以繼承和多態(tài)為特點(diǎn)的面向?qū)ο蟮某绦蛟O(shè)計(jì)。
    的頭像 發(fā)表于 02-15 09:43 ?540次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b><b class='flag-5'>詳細(xì)</b><b class='flag-5'>解說</b>3

    c++引用詳細(xì)解說4

    C++C語言的繼承,它可進(jìn)行過程化程序設(shè)計(jì),又可以進(jìn)行以抽象數(shù)據(jù)類型為特點(diǎn)的基于對象的程序設(shè)計(jì),還可以進(jìn)行以繼承和多態(tài)為特點(diǎn)的面向?qū)ο蟮某绦蛟O(shè)計(jì)。
    的頭像 發(fā)表于 02-15 09:43 ?524次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b><b class='flag-5'>詳細(xì)</b><b class='flag-5'>解說</b>4

    C++引用和指針

    之前的文章我們已經(jīng)介紹了C++中的基本類型如int,bool和double等,除了基本類型C++還有一些更復(fù)雜的數(shù)據(jù)類型復(fù)合類型,所謂的復(fù)合類型就是通過其他類型定義的類型,本篇文章我們將會(huì)著重介紹C++的復(fù)合類型
    的頭像 發(fā)表于 03-17 14:00 ?636次閱讀