<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## 一、引用的特性: * 引用在定義時必須初始化 * 一個變量可以有多個引用 * 引用一旦綁定某個實體,就不能再是其他變量的引用。 ## 二、引用和指針的區別與聯系: * 1.相同點: * 底層的實現方式相同,都是按照指針的方式實現的 * 2.不同點: * 引用定義的時候必須初始化,指針可以不用初始化; * 引用一旦初始化為指向一個對象,就不能再指向其他對象,而指針可以在任何時候指向任何一個同類型的對象; * 沒有空引用,但是有空指針; * 在sizeof中的含義不同:引用結果為引用類型的大小,但指針始終是地址空間所占字節的個數(在32為平臺下,指針求sizeof永遠是4); * 引用++改變的是變量的內容,指針++改變的是指針的指向; * 有多級指針,沒有多級引用; * 引用使用起來比指針安全; * 如果返回動態內存分配的對象或者內存,必須使用指針,引用可能引起內存泄漏; ## 三、傳值、傳地址、傳引用的區別,哪個更高效? * 1.傳值 * 這種傳遞方式中,實參和形參是兩個不同的地址空間,參數傳遞的實質是將原函數中變量的值,復制到被調用函數形參所在的存儲空間中,這個形參的地址空間在函數執行完畢后,會被回收掉。整個被調用函數對形參的操作,只影響形參對應的地址空間,不影響原函數中變量的值,因為這兩個不是同一個存儲空間。 **即使形參的值在函數中發生了變化,實參的值也完全不會受到影響,仍為調用前的值。** * 2.傳地址 * 這種傳遞方式中,實參是變量的地址,形參是指針類型的變量,在函數中對指針變量的操作,就是對實參(變量地址)所對應的變量的操作,函數調用結束后,原函數中的變量的值將會發生改變。 **被調用函數中對形參指針所指向的地址中內容的任何改變都會影響到實參。** * 3.傳引用 * 這種傳遞方式中,形參是引用類型變量,其實就是實參的一個別名,在被調用函數中,對引用變量的所有操作等價于對實參的操作。這樣,整個函數執行完畢后,原先的實參的值將會發生改變。 **被調函數對形參做的任何操作都影響了主調函數中的實參變量。** * 4.哪種更高效? * 在內置類型當中三種傳遞方式的效率上都差不多; * 在自定義類型當中,傳引用方式效率的更高效一些,因為它沒有對形參進行一次拷貝 ## 引用的使用場景 1.給變量起別名 2.將引用作為函數的參數 使用引用類型就不必在swap中聲明形參是指針變量,指針變量要另外開辟內存單元,其內容是地址。而引用變量不是一個獨立的變量,不單獨占內存單元。而且在調用swap函數時,只需要傳值即可,將引用作為函數的形參更加簡單、直觀、方便。 3.返回值 **C++不可以返回局部變量的引用或指針** ## 可以返回局部變量特例 ``` char *fun() { char *s = "1sfsdg"; return s;//返回的是1sfsdg的地址,1sfsdg存儲在字符常量區,也就在靜態存儲區。而指針變量s的地址&s是在棧上,會隨著函數的調用完被銷毀。 } ``` 函數返回處產生一個對返回對象的“左值”s的拷貝,也就是在“左值”拷貝中存儲了指向字符串常量1sfsdg的地址 **返回可以,因為返回的不是該函數的棧地址,而是靜態存儲區的地址。** ``` int ?*fun() { int *a = new int[10]//動態數組數組的空間在堆上,而指針變量a的地址&a在棧上,占4個字節,存儲著堆 ?? 上動態數組的首地址。 return a;//變量a的左值是一個局部變量指針,存儲于函數棧上,右值 是“堆”的地址(“堆”的值是數組里面存的 值),函數返回處產生一個對返回變量的“左值”a的拷貝,也就是在“左值”的拷貝中存儲了指向“堆”的地 址。 } ``` 返回可以。 ``` int *fun() { int a[10] ?= {.......};//靜態數組 return a;//靜態數組,在預處理階段就在該函數的棧上分配了空間,嘗試返回一個棧地址,錯誤 } ``` 返回不可以。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看