欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c++指針參數(shù)傳遞和引用參數(shù)傳遞的區(qū)別解析

 更新時(shí)間:2023年07月26日 08:57:15   作者:Explosion!  
這篇文章主要介紹了c++指針參數(shù)傳遞和引用參數(shù)傳遞的區(qū)別解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

c++指針參數(shù)傳遞和引用參數(shù)傳遞的區(qū)別

1) 指針參數(shù)傳遞本質(zhì)上是值傳遞,它所傳遞的是一個(gè)地址值。

值傳遞過程中,被調(diào)函數(shù)的形式參數(shù)作為被調(diào)函數(shù)的局部變量處理,會(huì)在棧中開辟內(nèi)存空間以存放由主調(diào)函數(shù)傳遞進(jìn)來的實(shí)參值,從而形成了實(shí)參的一個(gè)副本(替身)。

值傳遞的特點(diǎn)是,被調(diào)函數(shù)對(duì)形式參數(shù)的任何操作都是作為局部變量進(jìn)行的,不會(huì)影響主調(diào)函數(shù)的實(shí)參變量的值(形參指針變了,實(shí)參指針不會(huì)變)。

2) 引用參數(shù)傳遞過程中,被調(diào)函數(shù)的形式參數(shù)也作為局部變量在棧中開辟了內(nèi)存空間,但是這時(shí)存放的是由主調(diào)函數(shù)放進(jìn)來的實(shí)參變量的地址。

被調(diào)函數(shù)對(duì)形參(本體)的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調(diào)函數(shù)中的實(shí)參變量(根據(jù)別名找到主調(diào)函數(shù)中的本體)。

因此,被調(diào)函數(shù)對(duì)形參的任何操作都會(huì)影響主調(diào)函數(shù)中的實(shí)參變量。

3) 引用傳遞和指針傳遞是不同的,雖然他們都是在被調(diào)函數(shù)棧空間上的一個(gè)局部變量,但是任何對(duì)于引用參數(shù)的處理都會(huì)通過一個(gè)間接尋址的方式操作到主調(diào)函數(shù)中的相關(guān)變量。

而對(duì)于指針傳遞的參數(shù),如果改變被調(diào)函數(shù)中的指針地址,它將應(yīng)用不到主調(diào)函數(shù)的相關(guān)變量。如果想通過指針參數(shù)傳遞來改變主調(diào)函數(shù)中的相關(guān)變量(地址),那就得使用指向指針的指針或者指針引用。

4) 從編譯的角度來講,程序在編譯時(shí)分別將指針和引用添加到符號(hào)表上,符號(hào)表中記錄的是變量名及變量所對(duì)應(yīng)地址。

指針變量在符號(hào)表上對(duì)應(yīng)的地址值為指針變量的地址值,而引用在符號(hào)表上對(duì)應(yīng)的地址值為引用對(duì)象的地址值(與實(shí)參名字不同,地址相同)。

符號(hào)表生成之后就不會(huì)再改,因此指針可以改變其指向的對(duì)象(指針變量中的值可以改),而引用對(duì)象則不能修改。

從根本上將,指針和引用的效果類似,但是c++引入引用是為了方便運(yùn)算符重載,比如string類重載運(yùn)算符[ ]

class string{
    //...
    char& operato[] (int index);    //返回一個(gè)引用
}

c++不直接用引用代替指針,是為了兼容c語言

  • 需要返回函數(shù)內(nèi)局部變量的內(nèi)存的時(shí)候用指針。使用指針傳參需要開辟內(nèi)存,用完要記得釋放指針,不然會(huì)內(nèi)存泄漏。而返回局部變量的引用是沒有意義的

  • 對(duì)棧空間大小比較敏感(比如遞歸)的時(shí)候使用引用。使用引用傳遞不需要?jiǎng)?chuàng)建臨時(shí)變量,開銷要更小

  • 類對(duì)象作為參數(shù)傳遞的時(shí)候使用引用,這是C++類對(duì)象傳遞的標(biāo)準(zhǔn)方式

c++ 引用傳參和指針傳參的區(qū)別

概念

  • 指針從本質(zhì)上講是一個(gè)變量,變量的值是另一個(gè)變量的地址,指針在邏輯上是獨(dú)立的,它可以被改變的,包括指針變量的值(所指向的地址)和指針變量的值對(duì)應(yīng)的內(nèi)存中的數(shù)據(jù)(所指向地址中所存放的數(shù)據(jù))。
  • 引用從本質(zhì)上講是一個(gè)別名,是另一個(gè)變量的同義詞,它在邏輯上不是獨(dú)立的,它的存在具有依附性,所以引用必須在一開始就被初始化(先有這個(gè)變量,這個(gè)實(shí)物,這個(gè)實(shí)物才能有別名),而且其引用的對(duì)象在其整個(gè)生命周期中不能被改變,即自始至終只能依附于同一個(gè)變量(初始化的時(shí)候代表的是誰的別名,就一直是誰的別名,不能變)。

區(qū)別

指針變量,獨(dú)立,可變,可空,替身,無類型檢查
引用別名,依賴,不變,非空,本體,有類型檢查
  • 指針參數(shù)傳遞本質(zhì)上是值傳遞,它所傳遞的是一個(gè)地址值。值傳遞過程中,被調(diào)函數(shù)的形式參數(shù)作為被調(diào)函數(shù)的局部變量處理,會(huì)在棧中開辟內(nèi)存空間以存放由主調(diào)函數(shù)傳遞進(jìn)來的實(shí)參值,從而形成了實(shí)參的一個(gè)副本(替身)。值傳遞的特點(diǎn)是,被調(diào)函數(shù)對(duì)形式參數(shù)的任何操作都是作為局部變量進(jìn)行的,不會(huì)影響主調(diào)函數(shù)的實(shí)參變量的值(形參指針變了,實(shí)參指針不會(huì)變)。
  • 引用參數(shù)傳遞過程中,被調(diào)函數(shù)的形式參數(shù)也作為局部變量在棧中開辟了內(nèi)存空間,但是這時(shí)存放的是由主調(diào)函數(shù)放進(jìn)來的實(shí)參變量的地址。被調(diào)函數(shù)對(duì)形參(本體)的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調(diào)函數(shù)中的實(shí)參變量(根據(jù)別名找到主調(diào)函數(shù)中的本體)。因此,被調(diào)函數(shù)對(duì)形參的任何操作都會(huì)影響主調(diào)函數(shù)中的實(shí)參變量。
  • 引用傳遞和指針傳遞是不同的,雖然他們都是在被調(diào)函數(shù)??臻g上的一個(gè)局部變量,但是任何對(duì)于引用參數(shù)的處理都會(huì)通過一個(gè)間接尋址的方式操作到主調(diào)函數(shù)中的相關(guān)變量。而對(duì)于指針傳遞的參數(shù),如果改變被調(diào)函數(shù)中的指針地址,它將應(yīng)用不到主調(diào)函數(shù)的相關(guān)變量。如果想通過指針參數(shù)傳遞來改變主調(diào)函數(shù)中的相關(guān)變量(地址),那就得使用指向指針的指針或者指針引用。
  • 從編譯的角度來講,程序在編譯時(shí)分別將指針和引用添加到符號(hào)表上,符號(hào)表中記錄的是變量名及變量所對(duì)應(yīng)地址。指針變量在符號(hào)表上對(duì)應(yīng)的地址值為指針變量的地址值,而引用在符號(hào)表上對(duì)應(yīng)的地址值為引用對(duì)象的地址值(與實(shí)參名字不同,地址相同)。符號(hào)表生成之后就不會(huì)再改,因此指針可以改變其指向的對(duì)象(指針變量中的值可以改),而引用對(duì)象則不能修改。

以上內(nèi)容來源網(wǎng)絡(luò)

如何使用

如果我們編程只是為了做一些簡(jiǎn)單的工作,不想在技術(shù)上有什么質(zhì)的突破,那么使用指針就夠了。這樣做的問題就是,你寫的代碼很容易出bug??墒?,如果我們想要對(duì)c++有更深的了解,那么一定要區(qū)分指針傳參與引用傳參的區(qū)別。

使用指針傳遞參數(shù),是為了避免拷貝副本,從而提高程序執(zhí)行效率,大所數(shù)初學(xué)者(也包括我)都習(xí)慣使用指針傳遞參數(shù),因?yàn)檫€沒有建立起引用的概念,我們以為指針就是引用,殊不知,引用的內(nèi)涵比指針更豐富。因?yàn)橛玫纳?,所以?duì)引用的概念懵懵懂懂。其實(shí)有經(jīng)驗(yàn)的程序員在傳遞參數(shù)時(shí)很少使用指針。下面通過代碼來說明我們?yōu)槭裁匆褂靡脗鲄?,放棄指針傳參?/p>

  • 首先定義一個(gè)結(jié)構(gòu)體
struct ST
{
public:
	int num;
	string name;
	ST(int num, string name)
	{
		this->num = num;
		this->name = name;
	}
    void putInfo()
	{
		cout << "學(xué)號(hào):" << num << endl;
		cout << "姓名:" << name << endl;
	}
};

1.使用指針傳參

void dealProcess(ST* st)
{
	ST *newST =new ST(320, "小明");
	st = newST;//為臨時(shí)指針變量賦予了新值,已和輸入脫離了聯(lián)系。
}
int main()
{
	int num = 1;
	ST st1(310, "小紅");
	dealProcess(&st1);
	st1.putInfo();
	system("pause");
	return 0;
}

輸出結(jié)果

在這里插入圖片描述

使用指針傳參,想返回處理后的結(jié)果,但是我們得到的結(jié)果卻和預(yù)想的不一致。因?yàn)樵谔幚淼倪^程中,形參的地址發(fā)生了變化,和輸入脫離了聯(lián)系。

正確的寫法:

void dealProcess(ST* st)
{
	ST *newST =new ST(320, "小明");
	*st = *newST;
}

嚴(yán)謹(jǐn)?shù)膶懛ǎǖ缓?jiǎn)潔)

void dealProcess(ST* const st)//指定形參為常量指針,不能修改值
{
	ST *newST =new ST(320, "小明");
	*st=*newsT;
	st = newST;    //編譯錯(cuò)誤,不允許修改常量
}

void dealProcess(ST* const st)等價(jià)于void dealProcess(ST* st const)

2.既嚴(yán)謹(jǐn)又簡(jiǎn)潔的寫法,使用引用

void dealProcess(ST& st)
{
	ST newST(320, "小明");
	st = newST;    
	&st=&newsT;//編譯錯(cuò)誤,不允許改變輸入的地址
}
int main()
{
	int num = 1;
	ST st1(310, "小紅");
	dealProcess(st1);
	st1.putInfo();
	system("pause");
	return 0;
}

3.如果僅僅是使用輸入的值,應(yīng)該限定輸入為常量

首選是使用引用

void dealProcess(const ST& st)
{
	ST newST(0,"");
	newST.putInfo();
	//輸入的值不允許被改變
	st = newST;  //編譯錯(cuò)誤,只允許使用輸入,不允許改變輸入的值  
	&st = &newsT;//編譯錯(cuò)誤,不允許改變輸入的地址
	//使用輸入的值,
	newST = st;
	newST.putInfo();
}
int main()
{
	int num = 1;
	ST st1(310, "小紅");
	dealProcess(st1);
	system("pause");
	return 0;
}

在這里插入圖片描述

如果一定要使用指針,等價(jià)代碼如下

void dealProcess(const ST* const st)
{
	ST newST(0,"");
	newST.putInfo();
	//使用輸入的值
	newST = *st;
	newST.putInfo();
}
int main()
{
	int num = 1;
	ST st1(310, "小紅");
	dealProcess(&st1);
	system("pause");
	return 0;
}

到此這篇關(guān)于c++指針參數(shù)傳遞和引用參數(shù)傳遞的區(qū)別的文章就介紹到這了,更多相關(guān)c++指針參數(shù)傳遞和引用參數(shù)傳遞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++代碼實(shí)現(xiàn)網(wǎng)絡(luò)Ping功能

    C++代碼實(shí)現(xiàn)網(wǎng)絡(luò)Ping功能

    這篇文章主要介紹了C++代碼實(shí)現(xiàn)網(wǎng)絡(luò)Ping功能,Ping命令被送到本地計(jì)算機(jī)的IP軟件,該命令永不退出該計(jì)算機(jī),本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-08-08
  • C++中使用哈希表(unordered_map)的一些常用操作方法

    C++中使用哈希表(unordered_map)的一些常用操作方法

    C++標(biāo)準(zhǔn)庫(kù)中使用的unordered_map底層實(shí)現(xiàn)是哈希表,下面這篇文章主要給大家介紹了關(guān)于C++中使用哈希表(unordered_map)的一些常用操作方法,需要的朋友可以參考下
    2022-03-03
  • C++實(shí)現(xiàn)圖書管理系統(tǒng)最新版

    C++實(shí)現(xiàn)圖書管理系統(tǒng)最新版

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書管理系統(tǒng)最新版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言用封裝方法實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲

    C語言用封裝方法實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲

    這篇文章主要為大家詳細(xì)介紹了C語言用封裝方法實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++利用Opencv實(shí)現(xiàn)多個(gè)圓形檢測(cè)

    C++利用Opencv實(shí)現(xiàn)多個(gè)圓形檢測(cè)

    霍夫圓檢測(cè)是opencv中用來檢測(cè)圓的重要算法,簡(jiǎn)單的說,霍夫圓檢測(cè)就是對(duì)圖像中的弧線做切線,再在切點(diǎn)位置做切線的垂線,然后看這些垂線能交于一點(diǎn)的個(gè)數(shù),這個(gè)在方法中是自己設(shè)定的
    2022-08-08
  • c++實(shí)現(xiàn)逐行讀取配置文件寫入內(nèi)存的示例

    c++實(shí)現(xiàn)逐行讀取配置文件寫入內(nèi)存的示例

    這篇文章主要介紹了c++實(shí)現(xiàn)逐行讀取配置文件寫入內(nèi)存的示例,需要的朋友可以參考下
    2014-05-05
  • C語言實(shí)現(xiàn)簡(jiǎn)易通訊錄(靜態(tài)版本)的代碼分享

    C語言實(shí)現(xiàn)簡(jiǎn)易通訊錄(靜態(tài)版本)的代碼分享

    這篇文章主要為大家詳細(xì)介紹了如何錄音C語言實(shí)現(xiàn)一個(gè)簡(jiǎn)易的通訊錄(靜態(tài)版本),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-10-10
  • C++繼承類成員訪問權(quán)限修飾符詳解

    C++繼承類成員訪問權(quán)限修飾符詳解

    這篇文章主要為大家介紹了C++繼承類成員訪問權(quán)限修飾符,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • 使用C++實(shí)現(xiàn)單鏈表的操作與實(shí)踐

    使用C++實(shí)現(xiàn)單鏈表的操作與實(shí)踐

    在程序設(shè)計(jì)中,鏈表是一種常見的數(shù)據(jù)結(jié)構(gòu),特別是在動(dòng)態(tài)數(shù)據(jù)管理、頻繁插入和刪除元素的場(chǎng)景中,鏈表相比于數(shù)組,具有更高的靈活性和高效性,尤其是在需要頻繁修改數(shù)據(jù)結(jié)構(gòu)的應(yīng)用中,本文將詳細(xì)介紹如何用C++語言實(shí)現(xiàn)一個(gè)面向?qū)ο蟮膯捂湵?并展示完整的代碼示例
    2025-02-02
  • 排列和組合算法的實(shí)現(xiàn)方法_C語言經(jīng)典案例

    排列和組合算法的實(shí)現(xiàn)方法_C語言經(jīng)典案例

    下面小編就為大家?guī)硪黄帕泻徒M合算法的實(shí)現(xiàn)方法_C語言經(jīng)典案例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09

最新評(píng)論