C語言中函式呼叫中的傳值與傳址

2021-07-07 10:51:45 字數 1609 閱讀 4152

首先介紹一下函式中傳值與傳址的概念:

傳值:傳值,實際是把實參的值賦值給行參,相當於copy。那麼對行參的修改,不會影響實參的值 。

下來用兩個例子來說明:

先看看這個**

#include

void swap(int n1,int n2)

int main()

以上**實現的功能好像是交換兩個數的數值對吧!執行一下看看結果:

不對啊,和我們預想的不一樣啊,可以看到a,b的值並沒有被交換,怎麼回事呢?

因為a和b雖然成功把值傳給了n1、n2,n1、n2也完成了它們之間數值的交換,但是也僅僅是n1、n2之間交換了,和a、b沒有關係。這是一次單向的傳遞過程,a、b能傳給n1、n2,n1、n2能成功互換其數值,但n1、n2是定義在函式swap中的區域性變數,當函式呼叫結束後,它倆就over了,被殘忍拋棄了(子函式的生命期為子函式開始呼叫到結束呼叫,呼叫結束後就主動釋放了),因此它們沒有渠道把交換的值傳回給a、b。所以看到的是如上圖的結果。

有了以上的結果,我們再來看這樣一段**:

#include

void swap(int

*p1,int

*p2)

int main()

以上**的功能同樣是實現交換兩個數的數值對吧!讓我們再來看看執行結果:

很奇怪,為什麼這兒卻能交換了?除錯一下看看有什麼玄機:

這是呼叫swap函式前a、b的數值與其在記憶體中開闢的空間的位址以及呼叫函式後時*p1、*p2的數值與其位址。

這是呼叫swap函式後a、b的數值與其在記憶體中開闢的空間的位址以及開始呼叫函式時*p1、*p2的數值與其位址。

可以看到此時a、b與*p、*p2的位址空間是一樣的,那麼當*p1、*p2被修改時,a、b也會跟著發生變化,因為此時二者占用了同一塊空間,當任意一者使空間裡的內容發生變化時,二者都會做相同變化。

舉個不太恰當的例子,把夫妻二人各看做乙個變數,把它們的共用的銀行卡看做它們占用的同一塊空間,此時,他倆擁有的財產是一樣的,都是銀行卡裡的錢,那麼,不管誰花了或存了錢,他兩的財產都會發生同等改變,任意一人對財產的修改會影響到另乙個人的財產。(當然,私房錢不算)。仔細想想,其實大概就是這麼個道理。

函式呼叫的傳值與傳址大概就是這麼個過程,這快內容其實不難理解,只要知道其概念,通過實驗驗證,很容易掌握。

函式的傳值和傳址呼叫(C語言)

1 傳值呼叫。傳值呼叫顧名思義就是將引數的值傳遞給函式,而函式在進行呼叫時會複製這個值,然後將複製的值在函式中進行呼叫。void swap int a,int b int temp temp a a b b temp int main void int x 1,y 2 swap x,y printf...

傳值呼叫與傳址呼叫

眾所周知,函式的呼叫分為傳值呼叫和傳址呼叫,那他們的區別是什麼呢?傳值呼叫 函式的形參和實參分別占有不同的記憶體塊,對形參的修改不會影響實參。傳址呼叫 傳址呼叫是把函式外部建立變數的記憶體位址傳遞給函式引數的一種呼叫函式的方法。這種傳參方式可以讓函式和函式外邊的變數建立起真正的聯絡,也就是函式的內部...

C語言函式引數的傳值和傳址呼叫

大家都知道,c語言一般的引數都是傳值呼叫的,但有時候也有例外,下面就分析一下什麼時候傳值呼叫,什麼時候傳址呼叫。標量引數都是傳值呼叫,不會對標量產生任何影響 include void add one int value int main int argc,char const argv 執行結果 傳...