色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

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

黃工的嵌入式技術(shù)圈 ? 來源:編程珠璣 ? 作者:守望先生 ? 2020-02-26 16:35 ? 次閱讀

前言

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

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

傳值

我們在初學(xué)C語言的時候就被老師教過,下面的方式是無法交換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; }

運行結(jié)果如下:

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

可以看到,a和b的值最終并沒有被交換。開始時a,b的值為10,20,而最終還是同樣的值。

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

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

我們再結(jié)合下面的圖來理解:

值傳遞

首先圖中方框中的上部分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中永遠只是對a和b的副本進行操作,因此完全不影響原始的a和b的值。最終也不可能達到交換a和b的值的目的。

傳指針

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

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

運行結(jié)果:

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

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

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

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

我們再通過圖來理解前面為什么傳指針就可以交換a,b的值:

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

再看傳指針

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

#include #include voidgetMemery(int*p) { /*申請1024個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; }

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

addressofpis(nil)

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

getMemory

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

#include #include voidgetMemery(int**p) { /*申請1024個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; }

運行結(jié)果如下:

addressofpis0x144f010

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

可配合下面的圖進行理解:

getMemory

總結(jié)

本文總結(jié)如下:

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

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

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

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

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

    關(guān)注

    180

    文章

    7605

    瀏覽量

    136894
  • SWAP
    +關(guān)注

    關(guān)注

    0

    文章

    51

    瀏覽量

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

    關(guān)注

    3

    文章

    4332

    瀏覽量

    62647
收藏 人收藏

    評論

    相關(guān)推薦

    同樣是函數(shù),在CC++中有什么區(qū)別

    同樣是函數(shù),在 CC++ 中有什么區(qū)別? 第一個返回C
    的頭像 發(fā)表于 11-29 10:25 ?322次閱讀

    C語言程序設(shè)計教程第4版第8講:指針

    C語言指針講解
    發(fā)表于 11-20 14:10 ?0次下載

    C語言指針學(xué)習(xí)筆記

    本文從底層內(nèi)存分析,徹底讓讀者明白C語言指針的本質(zhì)。
    的頭像 發(fā)表于 11-05 17:40 ?244次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>指針</b>學(xué)習(xí)筆記

    C語言C++中結(jié)構(gòu)體的區(qū)別

    同樣是結(jié)構(gòu)體,看看在C語言C++中有什么區(qū)別
    的頭像 發(fā)表于 10-30 15:11 ?244次閱讀

    C語言指針詳細解析

    可以對數(shù)據(jù)本身,也可以對存儲數(shù)據(jù)的變量地址進行操作。 指針是一個占據(jù)存儲空間的實體在這一段空間起始位置的相對距離。在C/C++語言中,
    發(fā)表于 09-14 10:03

    面試???1:函數(shù)指針指針函數(shù)、數(shù)組指針指針數(shù)組

    函數(shù)是指返回指針函數(shù)。語法:返回類型*函數(shù)名(參數(shù)
    的頭像 發(fā)表于 08-10 08:11 ?871次閱讀
    面試常考+1:<b class='flag-5'>函數(shù)</b><b class='flag-5'>指針</b>與<b class='flag-5'>指針</b><b class='flag-5'>函數(shù)</b>、數(shù)組<b class='flag-5'>指針</b>與<b class='flag-5'>指針</b>數(shù)組

    網(wǎng)絡(luò)透和非透什么區(qū)別是什么

    :適用簡易、立即的數(shù)據(jù)傳輸,留意數(shù)據(jù)的完整性和低延遲。非透:適用必須進行數(shù)據(jù)解決優(yōu)化的狀況,提供良好的可靠性和效果。 在挑選傳輸技術(shù)時,務(wù)必根據(jù)實際的業(yè)務(wù)需求、數(shù)據(jù)種類、安全規(guī)定和傳輸效率等要素開展考量。
    的頭像 發(fā)表于 08-07 16:19 ?810次閱讀

    創(chuàng)建Trigger時設(shè)置的url可以參數(shù)嗎?

    創(chuàng)建Trigger時設(shè)置的url可以參數(shù)嗎?設(shè)置url參數(shù)的話沒有效果啊。默認url會傳遞參數(shù)嗎?在api文檔上沒有看到說明哦。
    發(fā)表于 07-15 07:30

    輕松搞懂透和非透區(qū)別

    和非透是數(shù)據(jù)通信中的兩種不同模式,各自有其適用場景和優(yōu)勢。透模式簡單、高效,適用于數(shù)據(jù)完整性要求高的場景;非透模式則通過數(shù)據(jù)處理提供安全性和可靠性,適用于復(fù)雜通信需求的場景。
    的頭像 發(fā)表于 06-05 12:03 ?9750次閱讀
    輕松搞懂透<b class='flag-5'>傳</b>和非透<b class='flag-5'>傳</b>的<b class='flag-5'>區(qū)別</b>

    C語言函數(shù)指針六大應(yīng)用場景詳解

    函數(shù)指針是一種非常強大的編程工具,它可以讓我們以更加靈活的方式編寫程序。在本文中,我們將介紹 6 個函數(shù)指針的高級應(yīng)用場景,并貼出相應(yīng)的代碼案例和解釋。
    的頭像 發(fā)表于 04-23 18:19 ?894次閱讀

    VI 間,,當(dāng)生成EXE時 不行,,

    VI 間,開發(fā)環(huán)境可以*附件:VI間其中一個為EXE時.rar,當(dāng)生成EXE時 不行,,
    發(fā)表于 03-22 11:52

    函數(shù)指針與回調(diào)函數(shù)的應(yīng)用實例

    通常我們說的指針變量是指向一個整型、字符型或數(shù)組等變量,而函數(shù)指針是指向函數(shù)。 函數(shù)指針
    的頭像 發(fā)表于 03-07 11:13 ?402次閱讀
    <b class='flag-5'>函數(shù)</b><b class='flag-5'>指針</b>與回調(diào)<b class='flag-5'>函數(shù)</b>的應(yīng)用實例

    C語言指針用法

    C語言編程中善用指針可以簡化一些任務(wù)的處理,而對于一些任務(wù)(比如動態(tài)內(nèi)存分配),必須要有指針才行的。也就是說精通C
    發(fā)表于 03-05 14:22 ?358次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>的<b class='flag-5'>指針</b>用法

    plc編程語言c語言的聯(lián)系 c語言和PLC什么區(qū)別

    語言,主要用于開發(fā)各種應(yīng)用程序。盡管PLC編程語言C語言一些相似之處,但它們之間也存在一些明顯的區(qū)別
    的頭像 發(fā)表于 02-05 14:21 ?4150次閱讀

    函數(shù)指針指針函數(shù)是不是一個東西?

    函數(shù)指針的本質(zhì)是指針,就跟整型指針、字符指針一樣,函數(shù)指針
    的頭像 發(fā)表于 01-03 16:35 ?536次閱讀
    <b class='flag-5'>函數(shù)</b><b class='flag-5'>指針</b>和<b class='flag-5'>指針</b><b class='flag-5'>函數(shù)</b>是不是一個東西?
    主站蜘蛛池模板: 乡村教师电影版| 国产精一品亚洲二区在线播放| gogo亚洲肉体艺术照片9090| 娇小8一12xxxx第一次| 武汉美女洗澡| 国产精品亚洲污污网站入口| 日韩欧美一区二区三区在线视频| 99热这里只有精品8| 男女全黄h全肉细节文| 99爱在线精品视频免费观看9| 久久久久国产精品美女毛片| 一边啪啪的一边呻吟声口述| 精品无码乱码AV| 伊人在线视频| 快乐激情站| 99国产精品| 秋霞电影院兔费理论观频84mb | 无敌在线视频观看免费| 公和熄洗澡三级中文字幕| 秋霞电影网午夜免费鲁丝片| 超碰99热在线精品视频| 少妇无套内谢久久久久| 国产精品人妻99一区二| 亚洲AV永久无码精品澳门| 和美女啪啪啪动态图| 一区二区视频在线观看高清视频在线 | 国产免费午夜| 亚洲中文有码字幕日本| 久久青草在线视频精品| 99九九99九九九视频精品| 日本wwwxx| 国产免费毛片在线观看| 伊人精品影院| 女生扒开下面| 国产精品igao视频网网址| 亚洲女人网| 免费a毛片| 国产-第1页-浮力影院| 亚洲欧美综合在线中文| 两性色午夜视频免费国产| 调教椅上的调教SM总裁被调教|