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

關(guān)于函數(shù)傳參問題(指針傳參,值傳參,引用傳參)

 更新時間:2024年01月01日 10:35:04   作者:不是杠杠  
這篇文章主要介紹了關(guān)于函數(shù)傳參問題(指針傳參,值傳參,引用傳參),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

形參和實參

什么是形參(parameter),什么是實參(argument)

在函數(shù)定義中出現(xiàn)的參數(shù)可以看做是一個占位符,它沒有數(shù)據(jù),只能等到函數(shù)被調(diào)用時接收傳遞進來的數(shù)據(jù),所以稱為形式參數(shù),簡稱形參

給形參傳遞值的變量稱為實際參數(shù),簡稱實參。

形參和實參關(guān)系

1) 形參變量只有在函數(shù)被調(diào)用時才會分配內(nèi)存,調(diào)用結(jié)束后,立刻釋放內(nèi)存,所以形參變量只有在函數(shù)內(nèi)部有效,不能在函數(shù)外部使用。 

2) 實參可以是常量、變量、表達式、函數(shù)等,無論實參是何種類型的數(shù)據(jù),在進行函數(shù)調(diào)用時,它們都必須有確定的值,以便把這些值傳送給形參,所以應(yīng)該提前用賦值、輸入等辦法使實參獲得確定值。 

3) 實參和形參在數(shù)量上、類型上、順序上必須嚴(yán)格一致,否則會發(fā)生“類型不匹配”的錯誤。當(dāng)然,如果能夠進行自動類型轉(zhuǎn)換,或者進行了強制類型轉(zhuǎn)換,那么實參類型也可以不同于形參類型。

實參為值傳值

代碼:

#include<iostream>
using namespace std;
void swap(int a,int b)
{
    cout<<"a address1 = "<<&a<<endl;
    cout<<"b address1 = "<<&b<<endl;
    int temp = a;
    a = b;
    b = temp;
}
 
int main()
{
    int a = 10;
    int b = 20;
    cout<<"a address = "<<&a<<endl;
    cout<<"b address = "<<&b<<endl;
    cout<<"original "<<"a = "<<a<<" b="<<b<<endl;
    swap(a,b);
    cout<<"swaped "<<"a = "<<a<<" b="<<b<<endl;
    return 0;
}

執(zhí)行結(jié)果:

分析結(jié)果:

實參a,b 和形參a,b的地址是不一樣的,因為形參a,b是整型變量,他們在函數(shù)調(diào)用時分配內(nèi)存,里面只是存放了和實參對應(yīng)得整型值,所以改變形參變量a,b的值并沒有改變實參a,b的值。形參a,b是臨時變量,當(dāng)函數(shù)運行結(jié)束時,他們的生命周期也就結(jié)束了。所以實參a,b的值并沒有改變。

圖解:

實參為指針傳值

實參本身為普通變量

代碼:

#include<iostream>
using namespace std;
void swap(int *a,int *b)
{
    cout<<"parameter a address1 = "<<&a<<endl;
    cout<<"parameter b address1 = "<<&b<<endl;
 
    cout<<"a value address1 = "<<a<<endl;
    cout<<"b value address1 = "<<b<<endl;
    int temp = *a;
    *a = *b;
    *b = temp;
}
 
int main()
{
    int a = 10;
    int b = 20;
    cout<<"a address = "<<&a<<endl;
    cout<<"b address = "<<&b<<endl;
    cout<<"original "<<"a = "<<a<<" b="<<b<<endl;
    swap(&a,&b);
    cout<<"swap "<<"a = "<<a<<" b="<<b<<endl;
    return 0;
}
 

執(zhí)行結(jié)果:

分析結(jié)果:

*p 指的是 指針變量p所指向的地址所存放的內(nèi)容

&p指的是指針本身的地址

p指的是指針?biāo)赶虻膬?nèi)容的地址

實參傳遞的是實參a,b的地址,形參a,b為指針類型的變量,也就是對應(yīng)存放的是實參a,b變量的地址,函數(shù)內(nèi)交換形參a,b指針?biāo)赶虻刂返膬?nèi)容,也就是交換了實參a,b地址指向空間的內(nèi)容,所以實參a,b的內(nèi)容被交換。

圖解:

 實參本身為指針

一級指針

代碼:

#include<iostream>
using namespace std;
 
void newPoint(int *p)
{
    cout<<"parameter p address = "<<&p<<endl;
    p = new int;
    *p = 10;
}
 
 
int main()
{
    int *p = NULL;
    cout<<"argument p address = "<<&p<<endl;
    newPoint(p);
    cout<<"*p = "<<*p<<endl;
    delete p;
    return 0;
}
~           

執(zhí)行結(jié)果:

分析結(jié)果:

實參指針p 沒有指向任何類容為空,當(dāng)實參給形參傳遞值時,傳遞的實際上是NULL,形參指針p 分配空間,僅僅只是給形參p分配了空間,當(dāng)函數(shù)退出時,實參指針指向的內(nèi)容還是為空,這時去訪問實參p指向的內(nèi)容,因為指針沒有指向確切地址,就會產(chǎn)生段錯誤,同時因為函數(shù)new了空間沒有釋放,還會造成內(nèi)存泄漏。

二級指針

代碼:

#include<iostream>
using namespace std;
 
void newPoint(int **p)
{
    cout<<"parameter p address = "<<&p<<endl;
    *p = new int;
    cout<<"parameter p value = "<<p<<endl;
    cout<<"parameter *p value = "<<*p<<endl;
    **p = 10;
}
 
 
int main()
{
    int *p = NULL;
    cout<<"argument p address = "<<&p<<endl;
    newPoint(&p);
    cout<<"argument p value = "<<p<<endl;
    cout<<"*p = "<<*p<<endl;
    delete p;
    return 0;
}
~       

執(zhí)行結(jié)果:

結(jié)果分析:

實參給形參傳遞的值是實參本身的地址 0x7ffe7feaa980,形參類型是二級指針,形參p存放的是一級指針實參p的地址,調(diào)用new之后,相當(dāng)于是給實參指針p分配了空間,實參指針指向的地址為0x55d013b6d280,給**p賦值,相當(dāng)于是給地址0x55d013b6d280指向的空間賦值,所以當(dāng)函數(shù)返回時,實參指針指向了確定的地址0x55d013b6d280,并且地址0x55d013b6d280指向的空間值為10;

圖解:

引用傳值

代碼:

#include<iostream>
using namespace std;
 
void swap(int& a,int& b)
{
    cout<<"parameter a address = "<< &a<<endl;
    cout<<"parameter b address = "<< &b<<endl;
    a = a+b;
    b = a-b;
    a = a-b;
 
}
 
int main()
{
    int a = 10;
    int b = 20;
 
    cout<<"argument a address = "<<&a<<endl;
    cout<<"argument b address = "<<&b<<endl;
    cout<<"original value"<<"a = "<<a<<" b ="<<b<<endl;
    swap(a,b);
    cout<<"swap value"<<"a = "<<a<<" b ="<<b<<endl;
    return 0;
}
~     

運行結(jié)果:

結(jié)果分析:

引用傳值,函數(shù)形參并沒有給形參分配內(nèi)存,而是和實參相同的內(nèi)存地址,節(jié)省了開銷,建議能用引用傳值的就用引用。

圖解:

總結(jié)

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

相關(guān)文章

  • 基于WTL中使用雙緩沖避免閃爍的解決方法

    基于WTL中使用雙緩沖避免閃爍的解決方法

    本篇文章是對WTL中使用雙緩沖避免閃爍的解決方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++之vector剖析及模擬實現(xiàn)方式

    C++之vector剖析及模擬實現(xiàn)方式

    文章詳解C++ vector實現(xiàn),涵蓋三個指針管理動態(tài)數(shù)組、容量擴容機制、元素增刪操作及深拷貝原理,強調(diào)迭代器安全性和memcpy對自定義類型的風(fēng)險,提供使用示例與注意事項
    2025-09-09
  • C語言中壓縮字符串的簡單算法小結(jié)

    C語言中壓縮字符串的簡單算法小結(jié)

    這篇文章主要介紹了C語言中可用于實現(xiàn)字符串壓縮的簡單算法小結(jié),列舉了包括哈夫曼算法等三個核心的程序?qū)崿F(xiàn)算法,需要的朋友可以參考下
    2016-03-03
  • C語言中打印特殊圖案的實現(xiàn)代碼

    C語言中打印特殊圖案的實現(xiàn)代碼

    以下代碼實現(xiàn)了在C語言中打印特殊圖案的解決方法。需要的朋友參考下
    2013-05-05
  • 幫VS2019 找回丟失的 SDK問題

    幫VS2019 找回丟失的 SDK問題

    最近很多朋友向小編求助在機器上的 vs2019 編譯 C++ 工程報錯問題,今天小編給大家分享幫VS2019 找回丟失的 SDK問題,感興趣的朋友一起看看吧
    2020-05-05
  • C++實現(xiàn)LeetCode(135.分糖果問題)

    C++實現(xiàn)LeetCode(135.分糖果問題)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(135.分糖果問題),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • c語言中abs()和fabs()的區(qū)別點整理

    c語言中abs()和fabs()的區(qū)別點整理

    在本篇文章里小編給大家分享的是關(guān)于c語言abs()和fabs()的區(qū)別,有需要的朋友們可以參考學(xué)習(xí)下。
    2020-02-02
  • C++實現(xiàn)打地鼠游戲設(shè)計

    C++實現(xiàn)打地鼠游戲設(shè)計

    這篇文章主要為大家詳細介紹了C++實現(xiàn)打地鼠游戲設(shè)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++使用curl庫進行http請求的方法詳解

    C++使用curl庫進行http請求的方法詳解

    這篇文章主要為大家詳細介紹了C++如何使用curl庫進行http請求,并且實現(xiàn)獲取返回的頭信息的時間,也就是獲取后臺服務(wù)的當(dāng)前時間,感興趣的可以了解一下
    2023-07-07
  • C++使用grpc實現(xiàn)回射服務(wù)器

    C++使用grpc實現(xiàn)回射服務(wù)器

    gRPC是由Google開發(fā)的一個開源的高性能遠程過程調(diào)用(RPC)框架,用于在分布式系統(tǒng)中實現(xiàn)跨語言的服務(wù)通信,本文我們就來看看C++如何使用grpc實現(xiàn)回射服務(wù)器
    2024-10-10

最新評論

葫芦岛市| 屯留县| 昌邑市| 河津市| 大关县| 宁城县| 名山县| 广宗县| 余姚市| 金溪县| 大竹县| 新竹县| 芷江| 曲沃县| 盘锦市| 漯河市| 巴彦县| 弋阳县| 库尔勒市| 政和县| 和硕县| 韶关市| 巴东县| 民县| 登封市| 云梦县| 修武县| 扎囊县| 青铜峡市| 论坛| 崇信县| 秦皇岛市| 乐安县| 宜兴市| 宁阳县| 咸丰县| 铁力市| 新营市| 汕头市| 蕉岭县| 阳信县|