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

C++引用和指針的區(qū)別你知道嗎

 更新時(shí)間:2022年01月11日 16:47:39   作者:Enjoy?solitude-  
這篇文章主要為大家介紹了C++引用和指針的區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>

引用

1.引用概念

引用不是新定義一個(gè)變量,而是給已存在變量取了一個(gè)別名,編譯器不會(huì)為引用變量開辟內(nèi)存空間,它和它引用的變量共用同一塊內(nèi)存空間。

比如:李逵,在家稱為"鐵牛",江湖上人稱"黑旋風(fēng)

2.格式

類型& 引用變量名(對(duì)象名) = 引用實(shí)體;

例:

void TestRef()
{
int a = 10;
int& ra = a;//<====定義引用類型
printf("%p\n", &a);
printf("%p\n", &ra);
}

在這里插入圖片描述

注意:引用類型必須和引用實(shí)體是同種類型的

3.引用特性

引用在定義時(shí)必須初始化一個(gè)變量可以有多個(gè)引用引用一旦引用一個(gè)實(shí)體,再不能引用其他實(shí)體

例:

在這里插入圖片描述

引用實(shí)例:

在這里插入圖片描述

4.常引用

1.const引用

eg1:

在這里插入圖片描述

const引用在傳參引用時(shí)的意義:

1.可以保護(hù)形參返回不會(huì)改變實(shí)參的值(函數(shù)傳參如果想減少拷貝而用了引用傳參,如果函數(shù)中不改變這個(gè)參數(shù),最好用const引用傳參)

2.即可接受變量,也可接受常量。

eg2:

在這里插入圖片描述

5.使用場(chǎng)景

1、引用作為參數(shù)

引用的一個(gè)重要作用就是作為函數(shù)的參數(shù)。以前的C語言中函數(shù)參數(shù)傳遞是值傳遞,如果有大塊數(shù)據(jù)作為參數(shù)傳遞的時(shí)候,采用的方案往往是指針,因?yàn)?這樣可以避免將整塊數(shù)據(jù)全部壓棧,可以提高程序的效率。但是現(xiàn)在(C++中)又增加了一種同樣有效率的選擇(在某些特殊情況下又是必須的選擇),就是引 用。

[例]:

void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
int main()
{
 int a,b;
      cin>>a>>b; //輸入a,b兩變量的值
      swap(a,b); //直接以變量a和b作為實(shí)參調(diào)用swap函數(shù)
      cout<<a<< ' ' <<b; //輸出結(jié)果

}

在這里插入圖片描述

由【例】可看出:

(1)傳遞引用給函數(shù)與傳遞指針的效果是一樣的。這時(shí),被調(diào)函數(shù)的形參就成為原來主調(diào)函數(shù)中的實(shí)參變量或?qū)ο蟮囊粋€(gè)別名來使用,所以在被調(diào)函數(shù)中對(duì)形參變量的操作就是對(duì)其相應(yīng)的目標(biāo)對(duì)象(在主調(diào)函數(shù)中)的操作。

(2)使用引用傳遞函數(shù)的參數(shù),在內(nèi)存中并沒有產(chǎn)生實(shí)參的副本,它是直接對(duì)實(shí)參操作;而使用一般變量傳遞函數(shù)的參數(shù),當(dāng)發(fā)生函數(shù)調(diào)用時(shí),需要給 形參分配存儲(chǔ)單元,形參變量是實(shí)參變量的副本;如果傳遞的是對(duì)象,還將調(diào)用拷貝構(gòu)造函數(shù)。因此,當(dāng)參數(shù)傳遞的數(shù)據(jù)較大時(shí),用引用比用一般變量傳遞參數(shù)的效 率和所占空間都好。

(3)使用指針作為函數(shù)的參數(shù)雖然也能達(dá)到與使用引用的效果,但是,在被調(diào)函數(shù)中同樣要給形參分配存儲(chǔ)單元,且需要重復(fù)使用"*指針變量名"的 形式進(jìn)行運(yùn)算,這很容易產(chǎn)生錯(cuò)誤且程序的閱讀性較差;另一方面,在主調(diào)函數(shù)的調(diào)用點(diǎn)處,必須用變量的地址作為實(shí)參。而引用更容易使用,更清晰。

2. 引用作為做返回值

下面代碼輸出什么結(jié)果?為什么?

int& Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int ret = Add(1, 2);
Add(3, 4);
cout << "Add(1, 2) is :"<< ret <<endl;
return 0;
}

在這里插入圖片描述

對(duì)于以上代碼,是將c的別名傳給了ret,結(jié)果確不確定,取決于平臺(tái)銷毀棧幀時(shí),是否清理?xiàng)臻g(由運(yùn)行結(jié)果知;vs下不清理)那么我們進(jìn)一步改動(dòng)實(shí)驗(yàn)證明引用返回的危害:

int& Add(int a, int b)
{
	int c = a + b;
	return c;
}
int main()
{
	int &ret = Add(1, 2);
	Add(3, 4);
	cout << "Add(1, 2) is :" << ret << endl;
	return 0;
}

此時(shí)相當(dāng)與retc的別名,再次運(yùn)行:

在這里插入圖片描述

結(jié)果出錯(cuò)。

舉個(gè)恰當(dāng)?shù)睦樱?/strong>

在這里插入圖片描述

因此注意:如果函數(shù)返回時(shí),出了函數(shù)作用域,如果返回對(duì)象還未還給系統(tǒng),則可以使用引用返回,如果已經(jīng)還給系統(tǒng)了,則必須使用傳值返回。

傳值、傳引用效率比較:

以值作為參數(shù)或者返回值類型,在傳參和返回期間,函數(shù)不會(huì)直接傳遞實(shí)參或者將變量本身直接返回,而是傳遞實(shí)參或者返回變量的一份臨時(shí)的拷貝,因此用值作為參數(shù)或者返回值類型,效率是非常低下的,尤其是當(dāng)參數(shù)或者返回值類型非常大時(shí),效率就更低。

例:

#include <time.h>
struct A{ int a[10000]; };
void TestFunc1(A a){}
void TestFunc2(A& a){}
void TestRefAndValue()
{
A a;
// 以值作為函數(shù)參數(shù)
size_t begin1 = clock();
for (size_t i = 0; i < 10000; ++i)
TestFunc1(a);
size_t end1 = clock();
// 以引用作為函數(shù)參數(shù)
size_t begin2 = clock();
for (size_t i = 0; i < 10000; ++i)
TestFunc2(a);
size_t end2 = clock();
// 分別計(jì)算兩個(gè)函數(shù)運(yùn)行結(jié)束后的時(shí)間
cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;
cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
}

在這里插入圖片描述

值和引用的作為返回值類型的性能比較:

#include <time.h>
struct A{ int a[10000]; };
A a;
// 值返回
A TestFunc1() { return a;}
// 引用返回
A& TestFunc2(){ return a;}
void TestReturnByRefOrValue()
{
// 以值作為函數(shù)的返回值類型
size_t begin1 = clock();
for (size_t i = 0; i < 100000; ++i)
TestFunc1();
size_t end1 = clock();
// 以引用作為函數(shù)的返回值類型
size_t begin2 = clock();
for (size_t i = 0; i < 100000; ++i)
TestFunc2();
size_t end2 = clock();
// 計(jì)算兩個(gè)函數(shù)運(yùn)算完成之后的時(shí)間
cout << "TestFunc1 time:" << end1 - begin1 << endl;
cout << "TestFunc2 time:" << end2 - begin2 << endl;
}

在這里插入圖片描述

通過上述代碼的比較,發(fā)現(xiàn)傳值和指針在作為傳參以及返回值類型上效率相差很大

6.引用和指針的區(qū)別

在語法概念上引用就是一個(gè)別名,沒有獨(dú)立空間,和其引用實(shí)體共用同一塊空間 在底層實(shí)現(xiàn)上實(shí)際是有空間的,因?yàn)橐檬前凑罩羔樂绞絹韺?shí)現(xiàn)的:

實(shí)例:

int main()
{
int a = 10;
int& ra = a;
ra = 20;
int* pa = &a;
*pa = 30;
return 0;
}

我們來看下引用和指針的匯編代碼對(duì)比:

在這里插入圖片描述

7.引用和指針的不同點(diǎn):

引用在定義時(shí)必須初始化,指針沒有要求

引用在初始化時(shí)引用一個(gè)實(shí)體后,就不能再引用其他實(shí)體,而指針可以在任何時(shí)候指向任何一個(gè)同類型 實(shí)體沒有NULL引用,但有NULL指針在sizeof中含義不同:引用結(jié)果為引用類型的大小,但指針始終是地址空間所占字節(jié)個(gè)數(shù)(32位平臺(tái)下占 4個(gè)字節(jié))引用自加即引用的實(shí)體增加1,指針自加即指針向后偏移一個(gè)類型的大小有多級(jí)指針,但是沒有多級(jí)引用訪問實(shí)體方式不同,指針需要顯式解引用,引用編譯器自己處理

引用比指針使用起來相對(duì)更安全

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C++實(shí)現(xiàn)LeetCode(67.二進(jìn)制數(shù)相加)

    C++實(shí)現(xiàn)LeetCode(67.二進(jìn)制數(shù)相加)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(67.二進(jìn)制數(shù)相加),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • QT5實(shí)現(xiàn)簡(jiǎn)單的TCP通信的實(shí)現(xiàn)

    QT5實(shí)現(xiàn)簡(jiǎn)單的TCP通信的實(shí)現(xiàn)

    本文主要介紹了QT5實(shí)現(xiàn)簡(jiǎn)單的TCP通信的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 基于Protobuf C++ serialize到char*的實(shí)現(xiàn)方法分析

    基于Protobuf C++ serialize到char*的實(shí)現(xiàn)方法分析

    本篇文章是對(duì)Protobuf C++ serialize到char*的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • 解讀C++11 原生字符串

    解讀C++11 原生字符串

    這篇文章主要介紹了C++11 原生字符串的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++11,感興趣的朋友可以了解下
    2020-08-08
  • QT中在QLabel顯示圖片并且利用鼠標(biāo)點(diǎn)擊畫線問題

    QT中在QLabel顯示圖片并且利用鼠標(biāo)點(diǎn)擊畫線問題

    這篇文章主要介紹了QT中在QLabel顯示圖片并且利用鼠標(biāo)點(diǎn)擊畫線問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++類中變量也可以是引用的代碼實(shí)例

    C++類中變量也可以是引用的代碼實(shí)例

    今天小編就為大家分享一篇關(guān)于C++類中變量也可以是引用的代碼實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • C++實(shí)現(xiàn)LeetCode(37.求解數(shù)獨(dú))

    C++實(shí)現(xiàn)LeetCode(37.求解數(shù)獨(dú))

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(37.求解數(shù)獨(dú)),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 基于C語言實(shí)現(xiàn)簡(jiǎn)單的掃雷小游戲

    基于C語言實(shí)現(xiàn)簡(jiǎn)單的掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了基于C語言實(shí)現(xiàn)簡(jiǎn)單的掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • c++ 動(dòng)態(tài)內(nèi)存分配相關(guān)總結(jié)

    c++ 動(dòng)態(tài)內(nèi)存分配相關(guān)總結(jié)

    這篇文章主要介紹了c++ 動(dòng)態(tài)內(nèi)存分配相關(guān)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)和使用c++,感興趣的朋友可以了解下
    2021-02-02
  • VSCode 配置C++開發(fā)環(huán)境的方法步驟

    VSCode 配置C++開發(fā)環(huán)境的方法步驟

    這篇文章主要介紹了VSCode 配置C++開發(fā)環(huán)境的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03

最新評(píng)論

昌黎县| 盐城市| 新绛县| 德格县| 周至县| 竹北市| 玛曲县| 濮阳县| 玉山县| 东至县| 洪湖市| 油尖旺区| 武鸣县| 汶上县| 四平市| 上虞市| 五指山市| 合江县| 南投市| 永顺县| 沐川县| 威信县| 东光县| 惠水县| 通榆县| 阿拉尔市| 通城县| 苍溪县| 新建县| 万荣县| 武义县| 延庆县| 克什克腾旗| 梓潼县| 岚皋县| 天峻县| 丹凤县| 定边县| 从江县| 上饶县| 罗平县|