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

詳解C++ 參數的三種傳遞方式和應用場景

 更新時間:2023年06月09日 10:21:20   作者:my_angle2016  
這篇文章主要介紹C++ 參數的三種傳遞方式和應用場景,C++ 參數的三種傳遞方式分別是值傳遞、指針傳遞和引用傳遞,感興趣的同學可以參考閱讀下

值傳遞

值傳遞的實質

  • 將實參的值(a、b)復制到形參(m、n)相應的存儲單元中,即形參和實參分別占用不同的存儲單元。

值傳遞的特點

  • 值傳遞的特點是單向傳遞,即主調函數被調用時給形參分配存儲單元,把實參的值傳遞給形參,在調用結束后,形參的存儲單元被釋放,而形參值的任何變化都不會影響到實參的值,實參的存儲單元仍保留并維持數值不變。

值傳遞的應用場景

  • 適用于傳遞簡單的數據類型,如int、float、double等。傳值是將參數的值傳遞給函數,函數內部會創(chuàng)建一個新的變量來存儲該值,對該變量的修改不會影響原變量的值。

例子1:我們首先講值傳遞,并且把它的特性列出來。下面我們先看代碼:

void test(int a) {
a += 3;
cout << “a的值:” << a << “\n”
<< “a的地址:” << &a << “\n”;
}
void main()
{
int b = 10;
test(b);
cout << “b的值:” << b << “\n”
<< “b的地址:” << &b << “\n”;
}

這是一個簡單的值傳遞,而地址就是內存位置,學過C++的人都清楚,下面是運行的結果

根據代碼和結果我們可以知道的是值傳傳遞的參數是有自己的內存的,并且當b把自己的值傳遞進去之后,對b是沒有影響的,那么值傳遞則是等于把b的值賦給了a等于進行了一個賦值操作這就是值傳遞。

指針傳遞

指針傳遞的實質

  • 所謂的地址傳遞,指的就是函數的參數是數組名或者指針。傳遞的是數組的首地址或指針的值,而形參接收到的是實參的地址,即指向實參的存儲單元,形參和實參占用相同的存儲單元,所以形參和實參是相同的。

特點

  • 形參并不存在存儲空間,編譯系統(tǒng)不為形參數組分配內存。因此在數組名或指針作函數參數時所進行的傳送只是地址傳送,形參在取得該地址之后,與實參共同擁有一段內存空間,形參的變化也就是實參的變化。

運用場景

  • 適用于傳遞數組、結構體等復雜的數據類型。指針傳遞是將參數的地址傳遞給函數,函數內部通過指針來訪問該變量,對該變量的修改會影響原變量的值。

例子2:接下下來我講指針傳遞,下面是指針傳遞的代碼:

void test(int *a) {
*a += 3;
cout << “a所指向地址:” << a << “\n”
<< “a的地址:” << &a << “\n”
<< “a所指向地址的值:” << *a << “\n”;
}
void main()
{
int b = 10;
test(&b);
cout << “b的值:” << b << “\n”
<< “b的地址:” << &b << “\n”;
}

這是一個指針傳遞,可以明顯的發(fā)現(xiàn)和值傳遞的差別,指針是存儲地址的,當我們想要把b的值傳進test()函數時,我們傳的是b的地址,然后通過b的地址,來獲得b的值,下面是結果

我們輸出的跟值傳遞不同的是什么呢,很明顯的是這次輸出的地址比值傳遞多一個地址,那這個多的地址和b的地址一模一樣,可以說明的是指針傳遞的是地址,然后還有不同的是b的值也被改變了,這就指針傳遞和值傳遞的不同。

引用傳遞

引用傳遞的實質

  • 形參相當于是實參的“別名”,對形參的操作其實就是對實參的操作,在引用傳遞過程中,被調函數的形式參數雖然也作為局部變量在棧中開辟了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。
  • 形參的地址是實參地址的映射,即擁有不同的儲存空間但是里面存放的地址相同。

特點

  • 被調函數對形參的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調函數中的實參變量。正因為如此,被調函數對形參做的任何操作都影響了主調函數中的實參變量。

運用場景

  • 適用于傳遞對象、類等復雜的數據類型。引用傳遞是將參數的引用傳遞給函數,函數內部通過引用來訪問該變量,對該變量的修改也會影響原變量的值。引用傳遞與指針傳遞相似,但使用起來更加簡潔明了。

例子3:最后一個是引用傳遞,引用傳遞,傳遞的是什么呢?它和值傳遞、指針傳遞不同的地方是什么呢,下面是代碼:

void test(int &a) {
a += 3;
cout << “a的值:” << a << “\n”
<< “a的地址:” << &a << “\n”;
}
void main()
{
int b = 10;
test(b);
cout << “b的值:” << b << “\n”
<< “b的地址:” << &b << “\n”;
}

在代碼上是不是發(fā)現(xiàn)和值傳遞差不多,只是參數聲明哪里比值傳遞的多了一個&符號其他的和值傳遞一樣,但是就是在參數聲明哪里多一個&符號,它就不是值傳遞,它的傳遞方式和值傳遞的是完全不一樣的,所以在寫參數聲明時,要注意不要在你需要的引用傳遞時漏了一個&符號,它們的不同之處在哪里呢,我們看輸出結果就知道了,下面是結果:

可以發(fā)現(xiàn)的是a的值和b的值是一樣的,上面我們說指針傳遞時,是輸出了一個a所指向地址的值,它的值和b的值是一樣,那么引用是不是和指針一樣傳的地址呢,其實不是的因為引用傳遞其實是等于把b作為test()函數的全局變量,為什么這樣說呢,是因為a的地址和b相同,然后a所做的所有操作都等于b做的,這a像是b的什么呢,這是名字不同,其他一樣,a其實就是b的一個別名,所以test()函數對a的所有操作,都等于對b進行,而a只是b的另外一個標識。
那么有人對引用傳遞還有疑惑對吧,&在參數處是引用在所有非參數聲明處都是獲取某個變量的地址。還有就是引用可不可以解地址對吧,其實是不可以的,我們可以看一下它如果對引用解地址的話會報什么錯誤。下面錯誤提示

它提示的*(解址符)的操作數必須是指針,意思只能對指針進行解址,對其他的類型是不能解址的。

總結:

然后我們總結一下值傳遞、指針傳遞和引用傳遞不同的地方,首先它們都是可以把值傳遞給函數的只不過是傳遞的方式不同,有一點是可以很明顯的,指針傳遞和引用傳遞都會改變b的值,值傳遞不會,這就是值傳遞和另外的區(qū)別,而指針傳遞和引用傳遞的不同的地方則是指針傳遞的是b的地址,而引用傳遞則等于給b起了一個別名,然后通過別名來操作b的值,和它所在的內存地址。

總而言之

值傳遞:形參開辟內存空間,與形參不同的地址,不能改變值。(變量名的訪問)

地址傳遞:形參不開辟內存空間,與形參相同的地址,能改變值。(地址的訪問)

引用傳遞:形參開辟內存空間,與形參相同的地址,能改變值。

到此這篇關于詳解C++ 參數的三種傳遞方式和應用場景的文章就介紹到這了,更多相關C++ 參數傳遞方式和應用場景內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言小項目實戰(zhàn)之通訊錄功能

    C語言小項目實戰(zhàn)之通訊錄功能

    這篇文章主要介紹了如何設計和實現(xiàn)一個簡單的通訊錄管理系統(tǒng),包括聯(lián)系人信息的存儲、增加、刪除、查找、修改和排序等功能,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-01-01
  • 四個例子說明C語言?全局變量

    四個例子說明C語言?全局變量

    這篇文章主要介紹了四個例子說明C語言?全局變量,全局變量是C語言語法和語義中一個很重要的知識點,首先它的存在意義需要從三個不同角度去理解,下面來看看這三個不同的內容分別是什么吧
    2022-04-04
  • C++類中的特殊成員函數示例詳解

    C++類中的特殊成員函數示例詳解

    這篇文章主要給大家介紹了關于C++類中特殊成員函數的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-02-02
  • C++用兩個棧實現(xiàn)一個隊列(面試官的小結)

    C++用兩個棧實現(xiàn)一個隊列(面試官的小結)

    這篇文章主要給大家介紹了關于C++用兩個棧實現(xiàn)一個隊列的相關資料,這是來自一名面試官的小結,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C++具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • C語言循環(huán)結構深入刨析

    C語言循環(huán)結構深入刨析

    C語言條件控制語句選擇結構,是屬于計算機的語言編輯,有在C語言條件控制中的語句選擇結構的存在,即是C語言條件控制語句選擇結構,循環(huán)控制語句是一個基于C語言的編程語句,該語句主要有while循環(huán)語句、do-while循環(huán)語句和for循環(huán)語句來實現(xiàn)循環(huán)結構
    2022-08-08
  • STL區(qū)間成員函數及區(qū)間算法總結

    STL區(qū)間成員函數及區(qū)間算法總結

    這篇文章主要匯總介紹了STL區(qū)間成員函數及區(qū)間算法,有需要的小伙伴可以參考下。
    2015-07-07
  • C語言測試n的階乘和x的n次方

    C語言測試n的階乘和x的n次方

    今天小編就為大家分享一篇關于C語言測試n的階乘和x的n次方,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • C語言對于volatile與gcc優(yōu)化的探究

    C語言對于volatile與gcc優(yōu)化的探究

    這篇文章主要介紹了C語言對于volatile與gcc優(yōu)化的探究,volatile是一個特征修飾符(type specifier) volatile的作用是作為指令關鍵字,確保本條指令不會因編譯器的優(yōu)化而省略,且要求每次直接讀值。這是百度百科的介紹,那編譯器是具體是怎么優(yōu)化的呢
    2023-02-02
  • C++示例講解string容器

    C++示例講解string容器

    c++相比c的一個好處就是實現(xiàn)了很多的容器和泛型算法,使得程序員的工作得到了很大的簡化,本文重點給大家介紹C++string容器基本概念講解,需要的朋友參考下吧
    2022-07-07
  • FFRPC應用 Client/Server使用及原理解析

    FFRPC應用 Client/Server使用及原理解析

    這篇文章主要介紹了FFRPC應用 Client/Server使用及原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08

最新評論