最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++?引用和指針的區(qū)別對比分析

 更新時間:2025年10月08日 10:05:33   作者:木杉的園子  
在C++?中,指針(Pointer)和引用(Reference)都用于間接訪問變量,但是它們在語法和語義上都有顯著的差異,下面通過本文給大家介紹C++?引用和指針的區(qū)別,感興趣的朋友一起看看吧

在 C++ 中,指針(Pointer)和引用(Reference)都用于間接訪問變量,但是它們在語法和語義上都有顯著的差異。指針是一個變量,它可以保存另一個變量的內(nèi)存地址;引用是另一個變量的別名,由編譯器進行處理,使用時與使用原變量無異。

指針和引用使用的一些差異如下:

初始化

指針:可以先定義后賦值,也可以指向不同的對象。

int a = 10, b = 20;
int* p = &a;
p = &b; // 改變指向

引用:必須在定義時就進行初始化,綁定到一個特定的對象,并且不能綁定到其他的對象。

int a = 10, b = 20;
int& r = a;  
r = b; // 修改的是 a 的值,而不是重新綁定,等價于 a=b

可空性

指針:可以被定義為 nullptr,表示不指向任何對象。

引用:必須綁定有效對象,不能為 null,否則會產(chǎn)生為定義的行為。

內(nèi)存占用

指針:由于存儲的是內(nèi)存地址,因此需要占用內(nèi)存空間,一般為 32 bit 或 64 bit。

引用:語義上不占用內(nèi)存空間,實際可能由編譯器實現(xiàn)為一個隱藏指針。

這里我們參考一篇博客: C++ 中指針和引用的區(qū)別。

參考以下使用引用和指針實現(xiàn)的 swap 函數(shù)。

void swap(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

引用版本 swap() 函數(shù)的匯編代碼如下:

# void swap(int &a, int &b)
__Z4swapRiS_:                           ## @_Z4swapRiS_
        .cfi_startproc
## %bb.0:
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp          
        .cfi_def_cfa_register %rbp
        movq    %rdi, -8(%rbp)         # 傳入的第一個參數(shù)存放到%rbp-8  (應(yīng)該是采用的寄存器傳參,而不是常見的壓棧)
        movq    %rsi, -16(%rbp)        # 第二個參數(shù) 存放到 %rbp-16
        movq    -8(%rbp), %rsi         # 第一個參數(shù)賦給 rsi
        movl    (%rsi), %eax           # 以第一個參數(shù)為地址取出值賦給eax,取出*a暫存寄存器
        movl    %eax, -20(%rbp)        # temp = a
        movq    -16(%rbp), %rsi        # 將第二個參數(shù)重復上面的
        movl    (%rsi), %eax
        movq    -8(%rbp), %rsi    
        movl    %eax, (%rsi)           # a = b
        movl    -20(%rbp), %eax        # eax = temp
        movq    -16(%rbp), %rsi
        movl    %eax, (%rsi)           # b = temp
        popq    %rbp
        retq
        .cfi_endproc
                                        ## -- End function

指針版本 swap() 函數(shù)的匯編代碼如下:

# void swap(int *a, int *b)
__Z4swapPiS_:                           ## @_Z4swapPiS_
        .cfi_startproc
## %bb.0:
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register %rbp
        movq    %rdi, -8(%rbp)
        movq    %rsi, -16(%rbp)
        movq    -8(%rbp), %rsi
        movl    (%rsi), %eax
        movl    %eax, -20(%rbp)
        movq    -16(%rbp), %rsi
        movl    (%rsi), %eax
        movq    -8(%rbp), %rsi
        movl    %eax, (%rsi)
        movl    -20(%rbp), %eax
        movq    -16(%rbp), %rsi
        movl    %eax, (%rsi)
        popq    %rbp
        retq
        .cfi_endproc
                                        ## -- End function

可以看到,兩個函數(shù)的匯編代碼幾乎完全一致。引用所賦的初值也就是綁定對象的內(nèi)存地址,訪問和修改對象內(nèi)容也是通過這個內(nèi)存地址完成的。

既然引用和指針的底層實現(xiàn)機制幾乎沒有區(qū)別,那么為什么我們需要使用引用呢?我認為有以下兩點:

  • 便捷性:能夠讓使用者使用引用與使用對象本身一致,由編譯器自動進行取地址、解引用的操作。
  • 安全性:引用必須初始化,且不能更換綁定,避免了懸空指針和野指針的問題,這在接口設(shè)計中更可靠,要求必須傳入合法的對象。

到此這篇關(guān)于C++ 引用和指針的區(qū)別對比分析的文章就介紹到這了,更多相關(guān)C++ 引用和指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++之多態(tài)(內(nèi)容不錯)

    C++之多態(tài)(內(nèi)容不錯)

    什么是多態(tài)?顧名思義就是同一個事物在不同場景下的多種形態(tài),需要的朋友可以參考下
    2020-01-01
  • C++實用庫之DNS解析的實現(xiàn)

    C++實用庫之DNS解析的實現(xiàn)

    DNS解析是一種將域名轉(zhuǎn)換為相應(yīng)的IP地址的過程,本文主要介紹了C++實用庫之DNS解析的實現(xiàn),實現(xiàn)了快速、準確的域名到IP地址的轉(zhuǎn)換,感興趣的可以了解一下
    2025-03-03
  • C++中虛繼承時的構(gòu)造函數(shù)示例詳解

    C++中虛繼承時的構(gòu)造函數(shù)示例詳解

    在虛繼承中,虛基類是由最終的派生類初始化的,換句話說,最終派生類的構(gòu)造函數(shù)必須要調(diào)用虛基類的構(gòu)造函數(shù),這跟普通繼承不同,在普通繼承中,派生類構(gòu)造函數(shù)中只能調(diào)用直接基類的構(gòu)造函數(shù),不能調(diào)用間接基類的,所以本文將通過代碼示例給大家介紹一下C++虛繼承構(gòu)造函數(shù)
    2023-09-09
  • C語言之把數(shù)組名作函數(shù)參數(shù)的四種情況說明

    C語言之把數(shù)組名作函數(shù)參數(shù)的四種情況說明

    這篇文章主要介紹了C語言之把數(shù)組名作函數(shù)參數(shù)的四種情況說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C語言實現(xiàn)直角坐標轉(zhuǎn)換為極坐標的方法

    C語言實現(xiàn)直角坐標轉(zhuǎn)換為極坐標的方法

    這篇文章主要介紹了C語言實現(xiàn)直角坐標轉(zhuǎn)換為極坐標的方法,涉及C語言進行三角函數(shù)與數(shù)值運算相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • C++中std::sort函數(shù)介紹和使用場景

    C++中std::sort函數(shù)介紹和使用場景

    std::sort函數(shù)是C++標準庫中常用的排序函數(shù)之一,它可以對各種類型的序列進行排序,本文就來介紹一下C++中std::sort函數(shù)介紹和使用場景,感興趣的可以了解一下
    2024-02-02
  • 基于排列與組合輸出多少中情況詳解

    基于排列與組合輸出多少中情況詳解

    本篇文章對排列與組合輸出多少中情況進行了介紹。需要的朋友參考下
    2013-05-05
  • NDK 數(shù)據(jù)結(jié)構(gòu)之隊列與棧等的實現(xiàn)

    NDK 數(shù)據(jù)結(jié)構(gòu)之隊列與棧等的實現(xiàn)

    這篇文章主要介紹了NDK 數(shù)據(jù)結(jié)構(gòu)之隊列與棧等的實現(xiàn)的相關(guān)資料,希望通過本文大家能理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • 利用Matlab制作抖音同款含褶皺面料圖

    利用Matlab制作抖音同款含褶皺面料圖

    這篇文章主要介紹了如何利用Matlab制作抖音的同款含褶皺面料圖,文中的示例代碼講解詳細,對我們學習Matlab有一定幫助,需要的可以參考一下
    2022-03-03
  • 純C語言實現(xiàn)火車售票系統(tǒng)

    純C語言實現(xiàn)火車售票系統(tǒng)

    這篇文章主要為大家詳細介紹了純C語言實現(xiàn)火車售票系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12

最新評論

江都市| 南京市| 丰城市| 松阳县| 黄浦区| 虞城县| 任丘市| 湖北省| 墨竹工卡县| 宜黄县| 元朗区| 宁城县| 沈阳市| 白朗县| 凤台县| 长乐市| 黎川县| 会昌县| 德保县| 开鲁县| 扎鲁特旗| 绥德县| 昔阳县| 泰兴市| 东乌珠穆沁旗| 屏东县| 清徐县| 平昌县| 五指山市| 台江县| 高尔夫| 磐石市| 资兴市| 双鸭山市| 张家界市| 濉溪县| 巫山县| 丁青县| 亳州市| 英德市| 海城市|