C語言形參和實參傳值和傳址詳解刨析
講解知識點之前,我們先來做一道題!
例題
寫一個函數可以交換兩個整形變量的內容
例如:
交換前:20 30
交換後:30 20
題目讓我們用函數的方式寫
#include <stdio.h> void Swap1(int x, int y) { int z = 0; z = x; x = y; y = z; } int main() { int a = 0; int b = 0; scanf("%d%d", &a, &b); //交換兩個變量 printf("交換前: a=%d b=%d\n", a, b); Swap1(a, b); printf("交換後: a=%d b=%d\n", a, b); return 0; }
運行結果:
20 30
交換前: a=20 b=30
交換後: a=20 b=30
咦?怎麼回事呢!為什麼沒有交換成功?
先別急,慢慢往下看!
分析
主函數裡面的Swap1(a, b)
中的a
和b
叫做實參(實際參數)
而當我們進到Swap1
函數內部的時候,Swap1(int x, int y)
中的x
和y
叫做形參(形式參數)
所以我們在調用Swap1函數
的時候,是不是把實際參數傳給瞭形式參數?
這個時候結論是這樣子的:
- 當函數調用的時候,實參傳給形參,形參其實是實參的一份臨時拷貝
什麼叫臨時拷貝呢?
- 形參有自己的獨立空間,隻是把實參的內容拷貝一份,放到形參裡面去
所以對形參的修改不會影響實參
實參與形參
實際參數(實參):
- 真實傳給函數的參數,叫實參。
- 實參可以是:常量、變量、表達式、函數等。
- 無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。
形式參數(形參):
- 形式參數是指函數名後括號中的變量,因為形式參數隻有在函數被調用的過程中才實例化(分配內存單元),所以叫形式參數。
- 形式參數當函數調用完成之後就自動銷毀瞭。因此形式參數隻在函數中有效。
修改
很明顯,剛剛那個代碼是錯誤的,那麼如何修改呢?
回想一下剛剛我們寫的函數:
- 寫瞭一個
Swap1
函數,把a、b
的值傳給瞭x、y
以後,x、y
的空間和a、b
的空間是獨立的空間 - 所以對
a、b
的修改是不會影響x、y
的,它們之間是沒有建立連接的
我們再寫一個函數命名為:Swap2
,讓Swap2
函數內部跟a、b
之間建立聯系
那麼怎麼讓它們之間建立聯系呢?
答案:指針
#include <stdio.h> void Swap2(int *pa, int *pb) { int z = 0; z = *pa; *pa = *pb; *pb = z; } int main() { int a = 0; int b = 0; scanf("%d%d", &a, &b); //交換兩個變量 printf("交換前: a=%d b=%d\n", a, b); Swap2(&a, &b); printf("交換後: a=%d b=%d\n", a, b); return 0; }
代碼運行結果:
20 30
交換前: a=20 b=30
交換後: a=30 b=20
分析
我先創建瞭a、b
變量,a、b裡面分別放瞭20、30
然後我把a的地址
取出來瞭,放到pa變量
裡面去瞭;
然後我把b的地址
取出來瞭,放到pb變量
裡面去瞭;
那麼pa
就有能力找到a
,pb
就有能力找到b
那麼*pa = a
,*pb = b
再定義瞭一個z變量
用於交換*pa
和*pb
傳值和傳址
我們來看看剛剛寫的代碼
#include <stdio.h> void Swap1(int x, int y) { int z = 0; z = x; x = y; y = z; } void Swap2(int *pa, int *pb) { int z = 0; z = *pa; *pa = *pb; *pb = z; } int main() { int a = 0; int b = 0; scanf("%d%d", &a, &b); //交換兩個變量 printf("交換前: a=%d b=%d\n", a, b); Swap1(a, b); Swap2(&a, &b); printf("交換後: a=%d b=%d\n", a, b); return 0; }
當我去調用Swap1函數
的時候,我把a、b
本身的變量傳到Swap1函數
,這種方式叫:傳值調用
當我去調用Swap2函數
的時候,我把a、b
的地址傳到Swap2函數
,這種方式叫:傳址調用
傳值調用
函數的形參和實參分別占有不同內存塊,對形參的修改不會影響實參
傳址調用
傳址調用是把函數外部創建變量的內存地址傳遞給函數參數的一種調用函數的方式。這種傳參方式可以讓函數和函數外邊的變量建立起真正的聯系,也就是函數內部可以直接操
作函數外部的變量
到此這篇關於C語言形參和實參傳值和傳址詳解刨析的文章就介紹到這瞭,更多相關C語言 參數內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!