C++左值引用與指針的區(qū)別及說明
更新時(shí)間:2025年03月04日 10:09:47 作者:_DCG_
左值引用與指針的區(qū)別:左值引用是一個(gè)別名,只能綁定左值,對(duì)左值引用的訪問與訪問左值是相同的;指針是一個(gè)變量,該變量在內(nèi)存中存在真是的物理地址,該變量?jī)?nèi)的存儲(chǔ)的是一個(gè)內(nèi)存地址,訪問指針變量對(duì)應(yīng)的內(nèi)容需要配合解訪問符*
C++左值引用與指針的區(qū)別
很多朋友遇到過這個(gè)問題
左值引用與指針有哪些區(qū)別?
腦子里閃過很多答案,但大部分都是各自的定義,真要說他們兩個(gè)有什么區(qū)別,有的時(shí)候還這是說不上來。
本文針對(duì)這個(gè)問題進(jìn)行歸納總結(jié),希望對(duì)大家有所幫助。
先從定義說起
- 左值引用:左值引用是一個(gè)別名,只能綁定左值,對(duì)左值引用的訪問與訪問左值是相同的
- 指針:指針是一個(gè)變量,這個(gè)變量在內(nèi)存中存在真是的物理地址,該變量?jī)?nèi)的存儲(chǔ)的是一個(gè)內(nèi)存地址,訪問指針變量對(duì)應(yīng)的內(nèi)容需要配合解訪問符*
看看下面的例子
void rreftTest(int&& ref) { std::cout<<"ref = "<<ref<<std::endl; } int main(int argc, char *argv[]) { cout<<endl; int x = 42; int& ref = x; int* ptr = &x; int&& rref = 4; // 輸出地址 std::cout << "x的地址: " << &x << std::endl; std::cout << "ref的地址: " << &ref << std::endl; std::cout << "ptr的地址: " << &ptr << std::endl; std::cout << "ptr指向的地址: " << ptr << std::endl; std::cout << "rref指向的地址: " << rref << std::endl; std::cout << "rref指向的地址: " << &rref << std::endl; rreftTest(rref); // 輸出大小 std::cout << "引用的大小: " << sizeof(ref) << std::endl; // 與int相同 std::cout << "指針的大小: " << sizeof(ptr) << std::endl; // 通常是4或8字節(jié) return 0; } //輸出如下所示: x的地址: 0x63fdbc ref的地址: 0x63fdbc ptr的地址:: 0x63fdb0 ptr指向的地址: 0x63fdbc rref指向的地址: 4 rref指向的地址: 0x63fdec 引用的大小: 4 指針的大小: 8
通過上面的例子得到如下結(jié)論
- 左值引用不占用額外內(nèi)存空間,它的地址與引用的左值地址相同;指針則不同,指針需要額外的內(nèi)存空間來存儲(chǔ)地址
- 引用必須在定義時(shí)初始化;指針變量可以不在定義時(shí)初始化
- 引用初始化綁定左值后,無法再重新綁定左值;指針則可以
- 不存在引用的引用,指針則可以
具體的例證程序如下:
//初始化 void initializationDifference() { int x = 42; // 引用必須在聲明時(shí)初始化 int& ref = x; // 正確 int& ref2; // 錯(cuò)誤!引用必須初始化 // 指針可以后續(xù)初始化 int* ptr; // 正確 ptr = &x; // 正確 } void rebindingTest() { int x = 42; int y = 24; // 引用一旦綁定就不能改變 int& ref = x; ref = y; // 這是賦值操作,不是重新綁定 // 指針可以隨時(shí)改變指向 int* ptr = &x; ptr = &y; // 改變指針指向 } //重復(fù)引用 void multiLevelTest() { int x = 42; // 不存在引用的引用 // int& & ref; // 錯(cuò)誤! // 可以有多級(jí)指針 int* ptr = &x; int** pptr = &ptr; // 正確 }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語言實(shí)現(xiàn)車輛出租管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)車輛出租管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01Windows下sentry接入C/C++程序的詳細(xì)過程
sentry作為一個(gè)開源的軟件,發(fā)展至今,已經(jīng)非常成熟。它支持的平臺(tái)眾多,甚至于針對(duì)不同的工作者(后臺(tái)、前端、客戶端)都有相應(yīng)的內(nèi)容,這篇文章主要介紹了Windows下sentry接入C/C++程序,需要的朋友可以參考下2022-09-09利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法示例
百馬百擔(dān)是道經(jīng)典的算法題,下面這篇文章主要給大家介紹了利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12C語言實(shí)現(xiàn)字符串字符反向排列的方法詳解
這篇文章主要為大家分享了幾種通過C語言實(shí)現(xiàn)字符串字符反向排列(不是逆序打印)的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-05-05