C語言形參和實參傳值和傳址詳解刨析
講解知識點(diǎn)之前,我們先來做一道題!
例題
寫一個函數(shù)可以交換兩個整形變量的內(nèi)容
例如:
交換前:20 30
交換后:30 20
題目讓我們用函數(shù)的方式寫
#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;
}
運(yùn)行結(jié)果:
20 30
交換前: a=20 b=30
交換后: a=20 b=30
咦?怎么回事呢!為什么沒有交換成功?
先別急,慢慢往下看!
分析
主函數(shù)里面的Swap1(a, b)中的a和b叫做實參(實際參數(shù))
而當(dāng)我們進(jìn)到Swap1函數(shù)內(nèi)部的時候,Swap1(int x, int y)中的x和y叫做形參(形式參數(shù))
所以我們在調(diào)用Swap1函數(shù)的時候,是不是把實際參數(shù)傳給了形式參數(shù)?
這個時候結(jié)論是這樣子的:
- 當(dāng)函數(shù)調(diào)用的時候,實參傳給形參,形參其實是實參的一份臨時拷貝
什么叫臨時拷貝呢?
- 形參有自己的獨(dú)立空間,只是把實參的內(nèi)容拷貝一份,放到形參里面去
所以對形參的修改不會影響實參
實參與形參
實際參數(shù)(實參):
- 真實傳給函數(shù)的參數(shù),叫實參。
- 實參可以是:常量、變量、表達(dá)式、函數(shù)等。
- 無論實參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時,它們都必須有確定的值,以便把這些值傳送給形參。
形式參數(shù)(形參):
- 形式參數(shù)是指函數(shù)名后括號中的變量,因為形式參數(shù)只有在函數(shù)被調(diào)用的過程中才實例化(分配內(nèi)存單元),所以叫形式參數(shù)。
- 形式參數(shù)當(dāng)函數(shù)調(diào)用完成之后就自動銷毀了。因此形式參數(shù)只在函數(shù)中有效。
修改
很明顯,剛剛那個代碼是錯誤的,那么如何修改呢?
回想一下剛剛我們寫的函數(shù):
- 寫了一個
Swap1函數(shù),把a、b的值傳給了x、y以后,x、y的空間和a、b的空間是獨(dú)立的空間 - 所以對
a、b的修改是不會影響x、y的,它們之間是沒有建立連接的
我們再寫一個函數(shù)命名為:Swap2,讓Swap2函數(shù)內(nèi)部跟a、b之間建立聯(lián)系
那么怎么讓它們之間建立聯(lián)系呢?
答案:指針
#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;
}
代碼運(yùn)行結(jié)果:
20 30
交換前: a=20 b=30
交換后: a=30 b=20
分析
我先創(chuàng)建了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;
}
當(dāng)我去調(diào)用Swap1函數(shù)的時候,我把a、b本身的變量傳到Swap1函數(shù),這種方式叫:傳值調(diào)用
當(dāng)我去調(diào)用Swap2函數(shù)的時候,我把a、b的地址傳到Swap2函數(shù),這種方式叫:傳址調(diào)用
傳值調(diào)用
函數(shù)的形參和實參分別占有不同內(nèi)存塊,對形參的修改不會影響實參
傳址調(diào)用
傳址調(diào)用是把函數(shù)外部創(chuàng)建變量的內(nèi)存地址傳遞給函數(shù)參數(shù)的一種調(diào)用函數(shù)的方式。這種傳參方式可以讓函數(shù)和函數(shù)外邊的變量建立起真正的聯(lián)系,也就是函數(shù)內(nèi)部可以直接操
作函數(shù)外部的變量
到此這篇關(guān)于C語言形參和實參傳值和傳址詳解刨析的文章就介紹到這了,更多相關(guān)C語言 參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++程序中使用Windows系統(tǒng)Native Wifi API的基本教程
這篇文章主要介紹了C++程序中使用Windows系統(tǒng)Native Wifi API的基本教程,包括在程序中控制無線網(wǎng)卡開關(guān)的方法,需要的朋友可以參考下2016-03-03
C/C++實現(xiàn)string和int相互轉(zhuǎn)換的常用方法總結(jié)
在C++編程中,經(jīng)常需要在字符串(string)和整型(int)之間進(jìn)行轉(zhuǎn)換,本文將詳細(xì)介紹幾種在C和C++中實現(xiàn)這兩種類型轉(zhuǎn)換的常用方法,有需要的可以參考下2024-01-01
使用root權(quán)限運(yùn)行自己所編譯程序的解決方法
本篇文章介紹了,使用root權(quán)限運(yùn)行自己所編譯程序的解決方法。需要的朋友參考下2013-05-05
C++實現(xiàn)地鐵自動售票系統(tǒng)程序設(shè)計
這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)地鐵自動售票系統(tǒng)程序設(shè)計,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
先序遍歷二叉樹的遞歸實現(xiàn)與非遞歸實現(xiàn)深入解析
以下是對先序遍歷二叉樹的遞歸實現(xiàn)與非遞歸實現(xiàn)進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-07-07

