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

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

 更新時間:2024年01月01日 10:05:33   作者:wrdasj  
這篇文章主要介紹了c++引用傳參和指針傳參的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

概念

指針從本質上講是一個變量,變量的值是另一個變量的地址,指針在邏輯上是獨立的,它可以被改變的,包括指針變量的值(所指向的地址)和指針變量的值對應的內存中的數(shù)據(jù)(所指向地址中所存放的數(shù)據(jù))。

引用從本質上講是一個別名,是另一個變量的同義詞,它在邏輯上不是獨立的,它的存在具有依附性,所以引用必須在一開始就被初始化(先有這個變量,這個實物,這個實物才能有別名),而且其引用的對象在其整個生命周期中不能被改變,即自始至終只能依附于同一個變量(初始化的時候代表的是誰的別名,就一直是誰的別名,不能變)。

區(qū)別

指針變量,獨立,可變,可空,替身,無類型檢查
引用別名,依賴,不變,非空,本體,有類型檢查

指針參數(shù)傳遞本質上是值傳遞,它所傳遞的是一個地址值。值傳遞過程中,被調函數(shù)的形式參數(shù)作為被調函數(shù)的局部變量處理,會在棧中開辟內存空間以存放由主調函數(shù)傳遞進來的實參值,從而形成了實參的一個副本(替身)。值傳遞的特點是,被調函數(shù)對形式參數(shù)的任何操作都是作為局部變量進行的,不會影響主調函數(shù)的實參變量的值(形參指針變了,實參指針不會變)。

引用參數(shù)傳遞過程中,被調函數(shù)的形式參數(shù)也作為局部變量在棧中開辟了內存空間,但是這時存放的是由主調函數(shù)放進來的實參變量的地址。被調函數(shù)對形參(本體)的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調函數(shù)中的實參變量(根據(jù)別名找到主調函數(shù)中的本體)。因此,被調函數(shù)對形參的任何操作都會影響主調函數(shù)中的實參變量。

引用傳遞和指針傳遞是不同的,雖然他們都是在被調函數(shù)棧空間上的一個局部變量,但是任何對于引用參數(shù)的處理都會通過一個間接尋址的方式操作到主調函數(shù)中的相關變量。而對于指針傳遞的參數(shù),如果改變被調函數(shù)中的指針地址,它將應用不到主調函數(shù)的相關變量。如果想通過指針參數(shù)傳遞來改變主調函數(shù)中的相關變量(地址),那就得使用指向指針的指針或者指針引用。

從編譯的角度來講,程序在編譯時分別將指針和引用添加到符號表上,符號表中記錄的是變量名及變量所對應地址。指針變量在符號表上對應的地址值為指針變量的地址值,而引用在符號表上對應的地址值為引用對象的地址值(與實參名字不同,地址相同)。符號表生成之后就不會再改,因此指針可以改變其指向的對象(指針變量中的值可以改),而引用對象則不能修改。

以上內容來源網絡

如何使用

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

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

首先定義一個結構體

struct ST
{
public:
	int num;
	string name;
	ST(int num, string name)
	{
		this->num = num;
		this->name = name;
	}
    void putInfo()
	{
		cout << "學號:" << num << endl;
		cout << "姓名:" << name << endl;
	}
};

1.使用指針傳參

void dealProcess(ST* st)
{
	ST *newST =new ST(320, "小明");
	st = newST;//為臨時指針變量賦予了新值,已和輸入脫離了聯(lián)系。
}

int main()
{
	int num = 1;
	ST st1(310, "小紅");
	dealProcess(&st1);
	st1.putInfo();
	system("pause");
	return 0;
}

輸出結果

在這里插入圖片描述

使用指針傳參,想返回處理后的結果,但是我們得到的結果卻和預想的不一致。因為在處理的過程中,形參的地址發(fā)生了變化,和輸入脫離了聯(lián)系。

正確的寫法:

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

嚴謹?shù)膶懛ǎǖ缓啙崳?/p>

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

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

2.既嚴謹又簡潔的寫法,使用引用

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

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

首選是使用引用

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

如果一定要使用指針,等價代碼如下

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;
}

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • C++將CBitmap類中的圖像保存到文件的方法

    C++將CBitmap類中的圖像保存到文件的方法

    這篇文章主要介紹了C++將CBitmap類中的圖像保存到文件的方法,涉及C++導出資源文件的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C/C++中如何判斷某一文件或目錄是否存在

    C/C++中如何判斷某一文件或目錄是否存在

    以下文章是對C/C++中判斷某一文件或目錄是否存在的實現(xiàn)代碼進行了詳細的分析介紹,需要的朋友可以參考下
    2013-07-07
  • C++優(yōu)先隊列的使用小結

    C++優(yōu)先隊列的使用小結

    普通的隊列是一種先進先出的數(shù)據(jù)結構,元素在隊列尾追加,而從隊列頭刪除,在優(yōu)先隊列中,元素被賦予優(yōu)先級,本文主要介紹了C++優(yōu)先隊列的使用,感興趣的可以了解一下
    2023-11-11
  • c語言程序設計文件操作方法示例(CreateFile和fopen)

    c語言程序設計文件操作方法示例(CreateFile和fopen)

    c主要的文件操作函數(shù)有:CreateFile,CloseHandle,ReadFile,WriteFile,SetFilePointer,GetFileSize。其中的讀寫操作是以字符為單位,獲得文件大小也是以字符為單位。
    2013-12-12
  • C++之BOOST字符串查找示例

    C++之BOOST字符串查找示例

    這篇文章主要介紹了C++之BOOST字符串查找的方法,實例演示了boost針對字符串的查找、判定及替換等操作,具有一定的實用價值,需要的朋友可以參考下
    2014-10-10
  • C/C++中常用加密與解密算法的實現(xiàn)

    C/C++中常用加密與解密算法的實現(xiàn)

    這篇文章主要為大家詳細介紹了一些在C++中常用的加密與解密算法,這其中包括Xor異或、BASE64、AES、MD5、SHA256、RSA等,感興趣的小伙伴可以學習一下
    2023-11-11
  • C++生成dll和調用dll的方法實例

    C++生成dll和調用dll的方法實例

    C++生成dll和調用dll的方法實例,需要的朋友可以參考一下
    2013-03-03
  • vscode cmake compilers配置路徑的實現(xiàn)

    vscode cmake compilers配置路徑的實現(xiàn)

    本文主要介紹了vscode cmake compilers配置路徑的實現(xiàn),文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-03-03
  • C++實現(xiàn)四則運算器(帶括號)

    C++實現(xiàn)四則運算器(帶括號)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)四則運算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++數(shù)組指針和二維數(shù)組詳情

    C++數(shù)組指針和二維數(shù)組詳情

    這篇文章主要介紹了C++數(shù)組指針和二維數(shù)組,指針數(shù)組和二維數(shù)組在應用中常用于函數(shù)傳參,下面我們就來看看指針數(shù)組和二維數(shù)組在應用中的具體使用吧,需要的朋友可以參考一下
    2021-10-10

最新評論