chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語(yǔ)言函數(shù)參數(shù)關(guān)于傳值和傳指針有什么區(qū)別?

黃工的嵌入式技術(shù)圈 ? 來(lái)源:編程珠璣 ? 作者:守望先生 ? 2020-02-26 16:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

函數(shù)傳參有三種傳參方式:傳值、傳址、傳引用。

我們可能聽(tīng)過(guò)C語(yǔ)言中的傳值和傳指針,在其他語(yǔ)言中,也有傳引用一說(shuō),那么他們到底有什么區(qū)別呢?如果你還不能準(zhǔn)確地分辨,就該好好了解一下了。

傳值

我們?cè)诔鯇W(xué)C語(yǔ)言的時(shí)候就被老師教過(guò),下面的方式是無(wú)法交換a和b的值的:

#include voidswap(inta,intb) { inttemp=a; a=b; b=temp; printf("swapa=%d,b=%d\n",a,b); } intmain(void) { inta=10; intb=20; printf("beforeswap:a=%d,b=%d\n",a,b); swap(a,b); printf("afterswap:a=%d,b=%d\n",a,b); return0; }

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

beforeswap:a=10,b=20 internalswapa=20,b=10 afterswap:a=10,b=20

可以看到,a和b的值最終并沒(méi)有被交換。開(kāi)始時(shí)a,b的值為10,20,而最終還是同樣的值。

為什么呢?因?yàn)楹瘮?shù)參數(shù)在傳遞的時(shí)候,都是傳原數(shù)據(jù)的副本,也就是說(shuō),swap內(nèi)部使用的a和b只是最初始a和b的一個(gè)副本而已,所以無(wú)論在swap函數(shù)內(nèi)部對(duì)a和b做任何改變,都不會(huì)影響初始的a和b的值。

正因如此,我們常常被告知,不要把直接把結(jié)構(gòu)體直接作為參數(shù),這樣效率會(huì)很低。由于結(jié)構(gòu)體本身占用字節(jié)數(shù)較大,如果直接作為參數(shù),那么將會(huì)產(chǎn)生一個(gè)較大的”副本“,如此一來(lái),效率也就很低了。

我們?cè)俳Y(jié)合下面的圖來(lái)理解:

值傳遞

首先圖中方框中的上部分a和b代表了main函數(shù)中的a和b,即原始數(shù)據(jù),而方框中的下部分a和b代表了函數(shù)的參數(shù)a和b,即原始數(shù)據(jù)的“副本”。(后面的圖都是如此,上部分代表原始值,下部分代表函數(shù)參數(shù)值)。

調(diào)用swap函數(shù)前后的情形如下:

調(diào)用swap前后

由于在swap中永遠(yuǎn)只是對(duì)a和b的副本進(jìn)行操作,因此完全不影響原始的a和b的值。最終也不可能達(dá)到交換a和b的值的目的。

傳指針

那么為解決上面的問(wèn)題,我們知道,需要傳指針。其代碼如下:

#include voidswap(int*a,int*b) { inttemp=*a; *a=*b; *b=temp; printf("swapa=%d,b=%d\n",*a,*b); } intmain(void) { inta=10; intb=20; printf("beforeswap:a=%d,b=%d\n",a,b); swap(&a,&b); printf("afterswap:a=%d,b=%d\n",a,b); return0; }

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

beforeswap:a=10,b=20 swapa=20,b=10 afterswap:a=20,b=10

可以看到在這種情況下,a,b的值才是真正交換了。

為什么又有傳值,又有傳指針

看到這里,不知道你是否會(huì)疑惑,為什么給函數(shù)傳遞參數(shù)的時(shí)候,一會(huì)是傳值,一會(huì)是傳指針呢?為什么傳指針就能改變參數(shù)的值呢?實(shí)際上,C語(yǔ)言里,參數(shù)傳遞都是值傳遞!也就是說(shuō),你認(rèn)為的傳指針也是傳值,只不過(guò)它的值是指針類型罷了。

我們?cè)偻ㄟ^(guò)圖來(lái)理解前面為什么傳指針就可以交換a,b的值:

從圖中可以看出,雖然傳遞給函數(shù)的是指向a和b的指針的副本,但是它的副本同樣也是指向a和b,因此雖然不能改變指針的指向,但是能改變參數(shù)a和b指向的內(nèi)容,即改變?cè)糰和b的值。

再看傳指針

如果是為指針p申請(qǐng)一段內(nèi)存,下面的代碼能達(dá)到目的嗎?

#include #include voidgetMemery(int*p) { /*申請(qǐng)1024個(gè)int大小*/ p=malloc(sizeof(int)*1024); if(NULL==p) { printf("mallocfailed\n"); p=NULL; } } intmain(void) { int*p=NULL; getMemery(p); printf("addressofpis%p\n",p); return0; }

通過(guò)前面的內(nèi)容分析,肯定是達(dá)不到預(yù)期效果的。
運(yùn)行結(jié)果:

addressofpis(nil)

這是為什么呢?我們還是利用前面所知來(lái)分析,由于傳遞給getMemory函數(shù)的參數(shù)都是一個(gè)副本,因此函數(shù)內(nèi)的p也是外部p的一個(gè)副本,因此即便在函數(shù)內(nèi)部,將p指向了一塊新申請(qǐng)的內(nèi)存,仍然不會(huì)改變外面p的值,即p還是指向NULL。

getMemory

如何修改呢?我們需要傳入p的地址,即指向int類型指針的指針。

#include #include voidgetMemery(int**p) { /*申請(qǐng)1024個(gè)int大小*/ *p=malloc(sizeof(int)*1024); if(NULL==*p) { printf("mallocfailed\n"); *p=NULL; } } intmain(void) { int*p=NULL; getMemery(&p); printf("addressofpis%p\n",p); free(p); p=NULL; return0; }

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

addressofpis0x144f010

從運(yùn)行結(jié)果可以看到,p的值被改變了,而不再是初始的NULL。

可配合下面的圖進(jìn)行理解:

getMemory

總結(jié)

本文總結(jié)如下:

函數(shù)的參數(shù)都是原數(shù)據(jù)的“副本”,因此在函數(shù)內(nèi)無(wú)法改變?cè)瓟?shù)據(jù)

函數(shù)中參數(shù)都是傳值,傳指針本質(zhì)上也是傳值

如果想要改變?nèi)雲(yún)?nèi)容,則需要傳該入?yún)⒌牡刂罚ㄖ羔樅鸵枚际穷愃频淖饔茫?,通過(guò)解引用修改其指向的內(nèi)容

以上結(jié)論不限于C語(yǔ)言

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    183

    文章

    7642

    瀏覽量

    144525
  • SWAP
    +關(guān)注

    關(guān)注

    0

    文章

    52

    瀏覽量

    13537
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4405

    瀏覽量

    66792
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    請(qǐng)問(wèn)jtag和jlink什么區(qū)別???

    jtag和jlink什么區(qū)別啊?
    發(fā)表于 11-28 06:46

    物聯(lián)網(wǎng)開(kāi)發(fā)必備:四款低功耗藍(lán)牙透模塊參數(shù)全解析與應(yīng)用實(shí)戰(zhàn)

    物聯(lián)網(wǎng)開(kāi)發(fā)必備:四款低功耗藍(lán)牙透模塊參數(shù)全解析與應(yīng)用實(shí)戰(zhàn) 作為物聯(lián)網(wǎng)設(shè)備的“無(wú)線神經(jīng)末梢”,低功耗藍(lán)牙(BLE)透模塊的選擇直接關(guān)系到產(chǎn)品的功耗、連接穩(wěn)定性與開(kāi)發(fā)周期。本文將從工程師視角,深度
    的頭像 發(fā)表于 11-05 14:37 ?292次閱讀

    微波雷達(dá)和毫米波雷達(dá)什么區(qū)別

    微波雷達(dá)和毫米波雷達(dá)什么區(qū)別 前言:不知道大家有沒(méi)有發(fā)現(xiàn),各種雷達(dá)模塊的使用開(kāi)始逐漸加入各種智能家居產(chǎn)品了,像人來(lái)燈亮,人走燈滅這種雷達(dá)感應(yīng)的產(chǎn)品早幾年就開(kāi)始進(jìn)入市場(chǎng)了,還有各種感應(yīng)開(kāi)關(guān)等產(chǎn)品
    的頭像 發(fā)表于 10-30 16:56 ?900次閱讀
    微波雷達(dá)和毫米波雷達(dá)<b class='flag-5'>有</b><b class='flag-5'>什么區(qū)別</b>

    Re-Driver 和 Re-Timer 什么區(qū)別?

    Re-Driver 和 Re-Timer 什么區(qū)別?
    發(fā)表于 08-21 06:14

    科普|無(wú)線圖和寬帶自組網(wǎng)什么區(qū)別

    這兩個(gè)設(shè)備到底哪些區(qū)別。其實(shí)無(wú)線圖和寬帶自組網(wǎng)設(shè)備在一些技術(shù)上是相通的,應(yīng)用也有部分重疊,但是整體的技術(shù)原理和應(yīng)用場(chǎng)景上上還是很大差別的。無(wú)線圖
    的頭像 發(fā)表于 08-15 17:44 ?703次閱讀
    科普|無(wú)線圖<b class='flag-5'>傳</b>和寬帶自組網(wǎng)<b class='flag-5'>有</b><b class='flag-5'>什么區(qū)別</b>?

    能光纖全面講解

    能光纖,又稱功率光纖,是一種具備特殊性能的光纖,在諸多領(lǐng)域發(fā)揮著關(guān)鍵作用。從嚴(yán)格意義上講,凡是能夠?qū)崿F(xiàn)較高激光能量傳輸?shù)墓饫w,均可被稱為能光纖。其顯著特點(diǎn)包括高功率傳輸能力、大芯徑、良好的柔韌性
    的頭像 發(fā)表于 08-12 09:06 ?421次閱讀

    CY7C65214和CY7C65211/3/5什么區(qū)別

    CY7C65214 和其他 USB 串行橋接控制器之間什么區(qū)別:CY7C65211、CY7C65213 和 CY7
    發(fā)表于 05-29 06:49

    函數(shù)指針的六個(gè)常見(jiàn)應(yīng)用場(chǎng)景

    函數(shù)指針在嵌入式開(kāi)發(fā)中有著廣泛的應(yīng)用,它讓代碼更加靈活,減少冗余,提高可擴(kuò)展性。很多時(shí)候,我們需要根據(jù)不同的情況動(dòng)態(tài)調(diào)用不同的函數(shù),而函數(shù)指針
    的頭像 發(fā)表于 04-07 11:58 ?1088次閱讀
    <b class='flag-5'>函數(shù)</b><b class='flag-5'>指針</b>的六個(gè)常見(jiàn)應(yīng)用場(chǎng)景

    GD32與STM32什么區(qū)別

    電子發(fā)燒友網(wǎng)站提供《GD32與STM32什么區(qū)別.docx》資料免費(fèi)下載
    發(fā)表于 04-03 17:27 ?0次下載

    怎樣選擇合適的數(shù)DTU?

    一款真正適配工業(yè)需求的數(shù)DTU?本文以濟(jì)南有人物聯(lián)網(wǎng)技術(shù)有限公司的明星產(chǎn)品USR-N720-C1為例,結(jié)合實(shí)際應(yīng)用場(chǎng)景,解析數(shù)DTU的選型要點(diǎn),助力企業(yè)實(shí)現(xiàn)高效、可靠的物聯(lián)網(wǎng)部署。 一、數(shù)
    的頭像 發(fā)表于 04-03 13:54 ?603次閱讀

    關(guān)于STM32 CAN通信發(fā)送函數(shù)HAL_CAN_AddTxMessage()的最后一個(gè)參數(shù)填0和定義一個(gè)變量取地址的問(wèn)題求解

    問(wèn)題: 關(guān)于STM32 CAN通信 發(fā)送函數(shù) HAL_CAN_AddTxMessage()的最后一個(gè)參數(shù)填0和定義一個(gè)變量取地址的問(wèn)題,如果直接0,我實(shí)驗(yàn)發(fā)現(xiàn) STM32F103
    發(fā)表于 03-11 08:22

    ATX主板和ITX主板什么區(qū)別?

    在計(jì)算機(jī)硬件領(lǐng)域,主板是承載計(jì)算機(jī)核心組件的關(guān)鍵部件,其類型多樣,性能也各有千秋。那么ATX主板和ITX主板什么區(qū)別呢,下面來(lái)介紹一下:
    的頭像 發(fā)表于 03-03 08:47 ?1533次閱讀

    私有云和公有云什么區(qū)別

    私有云和公有云在多個(gè)方面存在顯著的區(qū)別,以下是具體的比較,主機(jī)推薦小編為您整理發(fā)布私有云和公有云什么區(qū)別
    的頭像 發(fā)表于 02-20 10:38 ?1448次閱讀

    AIGC和AI什么區(qū)別

    AIGC是AI在內(nèi)容生成領(lǐng)域的一個(gè)特定應(yīng)用方向,AI的技術(shù)發(fā)展為AIGC提供了基礎(chǔ)和支撐。那么,AIGC和AI什么區(qū)別呢?下面,AI部落小編帶您詳細(xì)了解。
    的頭像 發(fā)表于 02-20 10:33 ?1620次閱讀

    C語(yǔ)言如何處理函數(shù)的返回

    當(dāng)你在函數(shù)的最后寫(xiě)上 return 0 的時(shí)候,它是如何返回給調(diào)用函數(shù)的? 比如 test 函數(shù),為了待會(huì)更好的看懂匯編代碼,我寫(xiě)成了 return 1234。 處理函數(shù)的返回
    的頭像 發(fā)表于 01-16 09:21 ?732次閱讀