C++左值引用與指針的區(qū)別及說明
更新時間:2025年03月04日 10:09:47 作者:_DCG_
左值引用與指針的區(qū)別:左值引用是一個別名,只能綁定左值,對左值引用的訪問與訪問左值是相同的;指針是一個變量,該變量在內(nèi)存中存在真是的物理地址,該變量內(nèi)的存儲的是一個內(nèi)存地址,訪問指針變量對應(yīng)的內(nèi)容需要配合解訪問符*
C++左值引用與指針的區(qū)別
很多朋友遇到過這個問題
左值引用與指針有哪些區(qū)別?
腦子里閃過很多答案,但大部分都是各自的定義,真要說他們兩個有什么區(qū)別,有的時候還這是說不上來。
本文針對這個問題進行歸納總結(jié),希望對大家有所幫助。
先從定義說起
- 左值引用:左值引用是一個別名,只能綁定左值,對左值引用的訪問與訪問左值是相同的
- 指針:指針是一個變量,這個變量在內(nèi)存中存在真是的物理地址,該變量內(nèi)的存儲的是一個內(nèi)存地址,訪問指針變量對應(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)存空間來存儲地址
- 引用必須在定義時初始化;指針變量可以不在定義時初始化
- 引用初始化綁定左值后,無法再重新綁定左值;指針則可以
- 不存在引用的引用,指針則可以
具體的例證程序如下:
//初始化
void initializationDifference() {
int x = 42;
// 引用必須在聲明時初始化
int& ref = x; // 正確
int& ref2; // 錯誤!引用必須初始化
// 指針可以后續(xù)初始化
int* ptr; // 正確
ptr = &x; // 正確
}
void rebindingTest() {
int x = 42;
int y = 24;
// 引用一旦綁定就不能改變
int& ref = x;
ref = y; // 這是賦值操作,不是重新綁定
// 指針可以隨時改變指向
int* ptr = &x;
ptr = &y; // 改變指針指向
}
//重復(fù)引用
void multiLevelTest() {
int x = 42;
// 不存在引用的引用
// int& & ref; // 錯誤!
// 可以有多級指針
int* ptr = &x;
int** pptr = &ptr; // 正確
}總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
利用C語言實現(xiàn)“百馬百擔(dān)”問題方法示例
百馬百擔(dān)是道經(jīng)典的算法題,下面這篇文章主要給大家介紹了利用C語言實現(xiàn)“百馬百擔(dān)”問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12

