亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

形參和實(shí)參

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

在函數(shù)定義中出現(xiàn)的參數(shù)可以看做是一個(gè)占位符,它沒(méi)有數(shù)據(jù),只能等到函數(shù)被調(diào)用時(shí)接收傳遞進(jìn)來(lái)的數(shù)據(jù),所以稱(chēng)為形式參數(shù),簡(jiǎn)稱(chēng)形參

給形參傳遞值的變量稱(chēng)為實(shí)際參數(shù),簡(jiǎn)稱(chēng)實(shí)參。

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

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

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

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

實(shí)參為值傳值

代碼:

#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é)果:

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

圖解:

實(shí)參為指針傳值

實(shí)參本身為普通變量

代碼:

#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)容的地址

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

圖解:

 實(shí)參本身為指針

一級(jí)指針

代碼:

#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é)果:

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

二級(jí)指針

代碼:

#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é)果分析:

實(shí)參給形參傳遞的值是實(shí)參本身的地址 0x7ffe7feaa980,形參類(lèi)型是二級(jí)指針,形參p存放的是一級(jí)指針實(shí)參p的地址,調(diào)用new之后,相當(dāng)于是給實(shí)參指針p分配了空間,實(shí)參指針指向的地址為0x55d013b6d280,給**p賦值,相當(dāng)于是給地址0x55d013b6d280指向的空間賦值,所以當(dāng)函數(shù)返回時(shí),實(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;
}
~     

運(yùn)行結(jié)果:

結(jié)果分析:

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

圖解:

總結(jié)

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

相關(guān)文章

  • C++之異常處理詳解

    C++之異常處理詳解

    C++中處理異常的過(guò)程是這樣的:在執(zhí)行程序發(fā)生異常,可以不在本函數(shù)中處理,而是拋出一個(gè)錯(cuò)誤信息,把它傳遞給上一級(jí)的函數(shù)來(lái)解決,上一級(jí)解決不了,再傳給其上一級(jí),由其上一級(jí)處理
    2013-08-08
  • C++ 基類(lèi)指針和子類(lèi)指針相互賦值的實(shí)現(xiàn)方法

    C++ 基類(lèi)指針和子類(lèi)指針相互賦值的實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇C++ 基類(lèi)指針和子類(lèi)指針相互賦值的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • Qt實(shí)現(xiàn)抽獎(jiǎng)小游戲的三種方式

    Qt實(shí)現(xiàn)抽獎(jiǎng)小游戲的三種方式

    本文主要介紹了Qt實(shí)現(xiàn)抽獎(jiǎng)小游戲的三種方式,主要包括while循環(huán),定時(shí)器,線(xiàn)程這三種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • C++?opencv實(shí)現(xiàn)幾何圖形繪制

    C++?opencv實(shí)現(xiàn)幾何圖形繪制

    這篇文章主要為大家介紹了C++?opencv實(shí)現(xiàn)幾何圖形的繪制示例實(shí)現(xiàn)代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • C++實(shí)現(xiàn)LeetCode(50.求x的n次方)

    C++實(shí)現(xiàn)LeetCode(50.求x的n次方)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(50.求x的n次方),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • opencv3/C++ FLANN特征匹配方式

    opencv3/C++ FLANN特征匹配方式

    今天小編就為大家分享一篇opencv3/C++ FLANN特征匹配方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • C++詳細(xì)講解圖論的基礎(chǔ)與圖的儲(chǔ)存

    C++詳細(xì)講解圖論的基礎(chǔ)與圖的儲(chǔ)存

    圖論〔Graph?Theory〕是數(shù)學(xué)的一個(gè)分支。它以圖為研究對(duì)象。圖論中的圖是由若干給定的點(diǎn)及連接兩點(diǎn)的線(xiàn)所構(gòu)成的圖形,這種圖形通常用來(lái)描述某些事物之間的某種特定關(guān)系,用點(diǎn)代表事物,用連接兩點(diǎn)的線(xiàn)表示相應(yīng)兩個(gè)事物間具有這種關(guān)系
    2022-05-05
  • C數(shù)據(jù)結(jié)構(gòu)之雙鏈表詳細(xì)示例分析

    C數(shù)據(jù)結(jié)構(gòu)之雙鏈表詳細(xì)示例分析

    以下是對(duì)c語(yǔ)言中的雙鏈表進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-08-08
  • Qt操作SQLite數(shù)據(jù)庫(kù)的教程詳解

    Qt操作SQLite數(shù)據(jù)庫(kù)的教程詳解

    SQLite是一款開(kāi)源、輕量級(jí)、跨平臺(tái)的數(shù)據(jù)庫(kù),無(wú)需server,無(wú)需安裝和管理配置。它的設(shè)計(jì)目標(biāo)是嵌入式的,所以很適合小型應(yīng)用,也是Qt應(yīng)用開(kāi)發(fā)種常用的一種數(shù)據(jù)庫(kù)。本文為大家介紹了Qt操作SQLite數(shù)據(jù)庫(kù)的示例,希望對(duì)大家有所幫助
    2022-12-12
  • C語(yǔ)言實(shí)現(xiàn)隨機(jī)發(fā)撲克牌

    C語(yǔ)言實(shí)現(xiàn)隨機(jī)發(fā)撲克牌

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)隨機(jī)發(fā)撲克牌,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評(píng)論