C++左值引用與指針的區(qū)別及說(shuō)明
C++左值引用與指針的區(qū)別
很多朋友遇到過(guò)這個(gè)問(wèn)題
左值引用與指針有哪些區(qū)別?
腦子里閃過(guò)很多答案,但大部分都是各自的定義,真要說(shuō)他們兩個(gè)有什么區(qū)別,有的時(shí)候還這是說(shuō)不上來(lái)。
本文針對(duì)這個(gè)問(wèn)題進(jìn)行歸納總結(jié),希望對(duì)大家有所幫助。
先從定義說(shuō)起
- 左值引用:左值引用是一個(gè)別名,只能綁定左值,對(duì)左值引用的訪(fǎng)問(wèn)與訪(fǎng)問(wèn)左值是相同的
- 指針:指針是一個(gè)變量,這個(gè)變量在內(nèi)存中存在真是的物理地址,該變量?jī)?nèi)的存儲(chǔ)的是一個(gè)內(nèi)存地址,訪(fǎng)問(wèn)指針變量對(duì)應(yīng)的內(nèi)容需要配合解訪(fǎng)問(wèn)符*
看看下面的例子
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通過(guò)上面的例子得到如下結(jié)論
- 左值引用不占用額外內(nèi)存空間,它的地址與引用的左值地址相同;指針則不同,指針需要額外的內(nèi)存空間來(lái)存儲(chǔ)地址
- 引用必須在定義時(shí)初始化;指針變量可以不在定義時(shí)初始化
- 引用初始化綁定左值后,無(wú)法再重新綁定左值;指針則可以
- 不存在引用的引用,指針則可以
具體的例證程序如下:
//初始化
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語(yǔ)言實(shí)現(xiàn)車(chē)輛出租管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)車(chē)輛出租管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Windows下sentry接入C/C++程序的詳細(xì)過(guò)程
sentry作為一個(gè)開(kāi)源的軟件,發(fā)展至今,已經(jīng)非常成熟。它支持的平臺(tái)眾多,甚至于針對(duì)不同的工作者(后臺(tái)、前端、客戶(hù)端)都有相應(yīng)的內(nèi)容,這篇文章主要介紹了Windows下sentry接入C/C++程序,需要的朋友可以參考下2022-09-09
利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法示例
百馬百擔(dān)是道經(jīng)典的算法題,下面這篇文章主要給大家介紹了利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
C語(yǔ)言實(shí)現(xiàn)字符串字符反向排列的方法詳解
這篇文章主要為大家分享了幾種通過(guò)C語(yǔ)言實(shí)現(xiàn)字符串字符反向排列(不是逆序打?。┑姆椒?,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-05-05
C++11新特性之四種類(lèi)型轉(zhuǎn)換cast說(shuō)明
類(lèi)型轉(zhuǎn)換是項(xiàng)目中常使用的一種語(yǔ)法規(guī)則,幾乎每個(gè)編程語(yǔ)言都不可避免的涉及到這方面,下面這篇文章主要給大家介紹了關(guān)于C++11新特性之四種類(lèi)型轉(zhuǎn)換cast說(shuō)明的相關(guān)資料,需要的朋友可以參考下2023-02-02

