<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          C語言丨參數(shù)傳遞的方式到底有幾種?

          共 2520字,需瀏覽 6分鐘

           ·

          2022-10-15 00:46

          點擊關(guān)注不迷路

          原創(chuàng)作者:三玹

          轉(zhuǎn)載請保留相關(guān)信息







          什么是參數(shù)傳遞?

          在程序運行過程中,將實際參數(shù)的值或者地址傳遞給被調(diào)用函數(shù)的形式參數(shù),從而在函數(shù)中完成對數(shù)據(jù)處理和返回的過程。

          在C語言當(dāng)中,參數(shù)的傳遞方式本質(zhì)上只有一種,就是值傳遞。

          但為了更好區(qū)分理解,劃分了兩種方式:值傳遞和指針傳遞。下面我們就來聊聊這兩種傳遞方式有什么不同。

          值傳遞

          值傳遞,是最普通的傳遞方式。將實際參數(shù)的值復(fù)制一份,然后傳遞給形式參數(shù),然后在函數(shù)內(nèi)完成數(shù)據(jù)處理和返回等行為。

          由于是復(fù)制的關(guān)系,因此形參在函數(shù)內(nèi)再怎么七十二變,對函數(shù)外部實參的值是沒有任何影響。

          下面來看 swap 交換函數(shù)的例子:

          #include<stdio.h>void swap(int x, int y){  int temp = x;  x = y;  y = temp;  printf("swap函數(shù)內(nèi)完成交換后:x=%d, y=%d\n", x, y);}int main(){  int a=3int b=4;  swap(a, b);  printf("調(diào)用swap函數(shù)后:a=%d, b=%d", a, b);  return 0;}
          運行結(jié)果:
          swap函數(shù)內(nèi)完成交換后:x=4, y=3
          調(diào)用swap函數(shù)后:a=3, b=4
          從結(jié)果中可以看到,swap函數(shù)中的兩個形參完成了交換,但是在函數(shù)外的實參該是怎么樣,還是怎么樣。
          這是因為在函數(shù)調(diào)用的時候,形參會在內(nèi)存中重新開辟一塊空間,用來接收實參傳遞過來的值。
          此時,形參和實參都是一個獨立的個體,互不影響。形參對它存儲的值愛怎么打扮的花枝招展,也影響不到實參存儲的值。
          由此可知,函數(shù)在每次調(diào)用的時候,都需要開辟一塊空間給形參來存儲值。我們上面的案例中形參接收的是 int 類型的參數(shù),所占空間是不大。
          但如果是數(shù)組、結(jié)構(gòu)體等大型數(shù)據(jù)類型,那每次調(diào)用傳值都要重新開辟一塊較大的空間,在調(diào)用結(jié)束后又要銷毀掉。這一過程非常的浪費時間和內(nèi)存空間,可謂相當(dāng)麻煩。
          那么有沒有直接一點的方式,我直接修改實參中的內(nèi)容就行了。
          方法是有的,接下來就來看另一種傳遞方式,指針傳遞。

          指針傳遞

          函數(shù)在調(diào)用的時候,形參總是要重新創(chuàng)建一個新的空間。那么有沒有什么辦法,可以讓形參開辟的空間盡可能???

          這里,就不得不提到指針。

          前面在聊指針類型的時候,有提到在同一個操作系統(tǒng)下,無論什么類型的指針,其所占用的內(nèi)存空間都是一樣的,如32位的操作系統(tǒng)下,指針類型所占空間為 4 個Byte(字節(jié))。

          如此一來,我們就可以將形參定義為指針類型。無論實參傳入什么,在函數(shù)調(diào)用時,形參所開辟的空間大小都是一樣的。

          下面來看一下swap函數(shù)指針傳遞的案例:

          #include<stdio.h>void swap(int *x, int *y){  int temp = *x;  *x = *y;  *y = temp;  printf("swap函數(shù)內(nèi)完成交換后:x=%d, y=%d\n", *x, *y);}int main(){  int a=3, int b=4;  swap(&a, &b);  printf("調(diào)用swap函數(shù)后:a=%d, b=%d", a, b);  return 0;}

          運行結(jié)果:

          swap函數(shù)內(nèi)完成交換后:x=4, y=3

          調(diào)用swap函數(shù)后:a=4, b=3

          從結(jié)果可以看出,函數(shù)內(nèi)的形參進(jìn)行了交換,同時函數(shù)外的實參也發(fā)生了交換。

          這是因為,形參所接收的是內(nèi)存地址,指針可以通過內(nèi)存地址進(jìn)行間接訪問實際變量的值,從而達(dá)到修改實際變量的值。

          本質(zhì)上來看,指針傳遞中實參傳給形參的是內(nèi)存地址,而內(nèi)存地址也是一個數(shù)據(jù)、一個值,因此指針傳遞也是屬于值傳遞。

          關(guān)于引用傳遞的問題

          網(wǎng)上搜索關(guān)于C語言參數(shù)傳遞方式有哪些,第一個搜索結(jié)果就給我個大大的框,C語言中函數(shù)參數(shù)傳遞的三種方式。

          作為一個求知者,我是抱著學(xué)習(xí)的態(tài)度去學(xué)的。學(xué)著學(xué)著,發(fā)現(xiàn)不對勁了。

          這里所說的三種傳遞方式,包括了上面的兩種方式,還有一種引用傳遞。

          檢驗真理的最佳方式,就是實踐!

          使用值傳遞和指針傳遞的方式,寫下swap函數(shù),結(jié)果是可以正常運行出來的。說明C語言當(dāng)中是有這兩種傳遞方式。

          #include<stdio.h>void swap(int &x, int &y){  int temp = x;  x = y;  y = temp;  printf("swap函數(shù)內(nèi)完成交換后:x=%d, y=%d\n", x, y);}int main(){  int a=3, int b=4;  swap(a, b);  printf("調(diào)用swap函數(shù)后:a=%d, b=%d", a, b);  return 0;}

          但是在檢驗引用傳遞的例子,還沒運行編輯器就一串爆紅。很顯然,引用傳遞不屬于C語言參數(shù)傳遞的方式。

          一番了解之后,才知道所謂的引用傳遞是C++語言中的特性。由于C和C++兩者代碼風(fēng)格和樣式相差不差,所以一開始就給弄混淆了,還真以為引用傳遞也是C語言中的傳遞方式之一。

          當(dāng)然也有部分的文章表示,C語言的兩種傳遞方式:值傳遞和引用傳遞。這里的引用傳遞也就是上面說的指針傳遞。

          最后

          關(guān)于參數(shù)的傳遞方式的內(nèi)容就到這里結(jié)束了。由于是個人網(wǎng)上查資料自學(xué),文中可能存在紕漏或者錯謬的地方,還望大家不吝賜教和指出,感謝!

          w3cschool編程獅

          專門幫助零基礎(chǔ)的同學(xué)們學(xué)習(xí)編程基礎(chǔ)的學(xué)習(xí)

          瀏覽 37
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲国产系列 | 99久久久无码国产一区二区三区 | 親子亂子倫XXXX0路舒淇 日本丰满少妇黄大片在线观看 | 黄色性爱免费视频 | 吊逼|