C++ 中引用與指針的區(qū)別實(shí)例詳解
C++ 中引用與指針的區(qū)別實(shí)例詳解
引用是從C++才引入的,在C中不存在。為了搞清楚引用的概念,得先搞明白變量的定義及引用與變量的區(qū)別,變量的要素一共有兩個(gè):名稱(chēng)與空間。
引用不是變量,它僅僅是變量的別名,沒(méi)有自己獨(dú)立的空間,它只符合變量的“名稱(chēng)”這個(gè)要素,而“空間”這個(gè)要素并不滿足。換句話說(shuō),引用需要與它所引用的變量共享同一個(gè)內(nèi)存空間,對(duì)引用所做的改變實(shí)際上是對(duì)所引用的變量做出修改。并且引用在定義的時(shí)候就必須被初始化。
參數(shù)傳遞的類(lèi)型及相關(guān)要點(diǎn):
1 按值傳遞:形參不能修改實(shí)參的值,實(shí)參要初始化形參,需要分配空間,然后將實(shí)參內(nèi)容copy至形參中。
2 引用傳遞:實(shí)參初始化形參時(shí)不需要分配空間。
3 指針傳遞:本質(zhì)還是按值傳遞,在實(shí)參初始化形參時(shí),還是需要分配空間的。如果需要修改指針的地址,單純用指針傳遞也是不行的,必須用**或*&
下面討論引用的相關(guān)內(nèi)容:
1 引用的概念
2 const引用
3 引用作為參數(shù)傳遞
4 引用作為函數(shù)返回值
5 引用與指針的區(qū)別
1 引用的概念
牢記下面這幾個(gè)要點(diǎn)即可:
(1)引用是變量的別名,沒(méi)有獨(dú)立的空間
(2) 引用需要與它引用的變量共享共間
(3) 對(duì)引用所做的改變實(shí)際上是對(duì)它所引用的變量做出改變
(4) 引用在定義的時(shí)候需要進(jìn)行初始化
(5) 引用一經(jīng)初始化不能重新引用其它變量。
見(jiàn)如下范例:
int main(void)
{
int val = 100;
//int &refval;<span style="white-space:pre"> </span>//Error,引用必須初始化
int &refval = val;
cout << "val="<< val << endl;
refval = 200; <span style="white-space:pre"> </span>//實(shí)際對(duì)val變量進(jìn)行了改變
cout << "val=" << val << endl;
int val2 = 500;
refval = val2; <span style="white-space:pre"> </span>//這不代表對(duì)refval引用至val2這個(gè)變量,
//僅僅代表將val2賦值給refval,即val.
cout << "val=" << val << endl;
return 0;
}
2 const引用
const引用要點(diǎn)如下:
(1) 顧名思義,const引用是指向const對(duì)象的引用.
(2) const引用可以引用非const對(duì)象,但非const引用不能引用const對(duì)象??梢砸?jiàn)下面的函數(shù)例子.
int a = 200; const int &ref = a; //OK const int b = 100; int &ref2 = b; //Error,
(3) const引用的對(duì)象值是常量,不能修改。
const int a = 200; const int &ref = a; ref = 100; //Error,引用的對(duì)象是常量,不能被修改
(4) const引用可以引用不同類(lèi)型的變量,但是將產(chǎn)生一個(gè)臨時(shí)變量。如下:
double a = 3.14;
const int &ref = a; //OK,它產(chǎn)生的過(guò)程是:
//int tmp = a; 生成臨時(shí)變量tmp,數(shù)據(jù)可能被截短。
//const int &ref = tmp;引用的實(shí)際上是臨時(shí)變量
3 引用作為參數(shù)傳遞
引用作為參數(shù)傳遞是參數(shù)傳遞的其中一種。它在實(shí)參初始化形參時(shí)不需要分配內(nèi)存空間,下面是例子:
void swap(int &a, int &b )
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int x = 20;
int y = 30;
swap( x, y );
cout << x << endl; //x = 30;
cout << y << endl; //y = 20;
}
4 引用作為函數(shù)返回值
先列出范例,如下:
int a[] = {1,2,3,4,5,6,7,8,9,0};
int &index(int i)
{
return a[i];
}
int main()
{
index(3) = 100;
cout << a[3] << endl; //output: 100
}
這是引用的另一個(gè)作用,可以將函數(shù)放在賦值運(yùn)算符的左邊。index函數(shù)返回a[]的引用,對(duì)引用所做的改變將修改變量自身,所以a[3]被修改成100.
5 引用與指針的區(qū)別
(1)訪問(wèn)引用是直接訪問(wèn),訪問(wèn)指針是間接訪問(wèn)。
(2)引用是變量的別名,本身不單獨(dú)分配自己的內(nèi)存空間,而指針擁有自己的內(nèi)存空間
(3) 引用一經(jīng)初始化,不能再引用其它變量,而指針可以
(4) 盡可以的使用引用,不得已時(shí)使用指針。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
C++?棧和隊(duì)列的實(shí)現(xiàn)超詳細(xì)解析
棧和隊(duì)列,嚴(yán)格意義上來(lái)說(shuō),也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯?chǔ)邏輯關(guān)系為?"一對(duì)一"?的數(shù)據(jù),但由于它們比較特殊,因此將其單獨(dú)作為一章,做重點(diǎn)講解2022-03-03
C語(yǔ)言實(shí)現(xiàn)的PNPoly算法代碼例子
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)的PNPoly算法代碼例子,PNPoly算法j是判斷一個(gè)坐標(biāo)點(diǎn)是否在不規(guī)則多邊形內(nèi)部的算法,需要的朋友可以參考下2014-07-07
C語(yǔ)言實(shí)現(xiàn)控制臺(tái)掃雷小游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)控制臺(tái)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11
使用代碼驗(yàn)證linux子進(jìn)程與父進(jìn)程的關(guān)系
Linux下父進(jìn)程可以使用fork 函數(shù)創(chuàng)建子進(jìn)程,但是當(dāng)父進(jìn)程先退出后,子進(jìn)程會(huì)不會(huì)也退出呢?通過(guò)下面這個(gè)小實(shí)驗(yàn),我們能夠很好的看出來(lái)2014-02-02
C/C++中棧(stack)&堆(heap)詳解及其作用介紹
這篇文章主要介紹了C/C++中棧(stack)&堆(heap)詳解及其作用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
C++中VTK9.3.0刻度標(biāo)簽重疊的問(wèn)題記錄
這篇文章主要介紹了C++中VTK9.3.0刻度標(biāo)簽重疊的問(wèn)題,本文采用VTK9.3.0版本,其他版本如VKT8.0亦有同樣的問(wèn)題,需要的朋友可以參考下2024-06-06
C語(yǔ)言實(shí)現(xiàn)飛機(jī)訂票系統(tǒng)的完整代碼
C++中vector<vector<int>?>的基本使用方法

