C語(yǔ)言形參和實(shí)參傳值和傳址詳解刨析
講解知識(shí)點(diǎn)之前,我們先來(lái)做一道題!
例題
寫(xiě)一個(gè)函數(shù)可以交換兩個(gè)整形變量的內(nèi)容
例如:
交換前:20 30
交換后:30 20
題目讓我們用函數(shù)的方式寫(xiě)
#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); //交換兩個(gè)變量 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
咦?怎么回事呢!為什么沒(méi)有交換成功?
先別急,慢慢往下看!
分析
主函數(shù)里面的Swap1(a, b)
中的a
和b
叫做實(shí)參(實(shí)際參數(shù))
而當(dāng)我們進(jìn)到Swap1
函數(shù)內(nèi)部的時(shí)候,Swap1(int x, int y)
中的x
和y
叫做形參(形式參數(shù))
所以我們?cè)谡{(diào)用Swap1函數(shù)
的時(shí)候,是不是把實(shí)際參數(shù)傳給了形式參數(shù)?
這個(gè)時(shí)候結(jié)論是這樣子的:
- 當(dāng)函數(shù)調(diào)用的時(shí)候,實(shí)參傳給形參,形參其實(shí)是實(shí)參的一份臨時(shí)拷貝
什么叫臨時(shí)拷貝呢?
- 形參有自己的獨(dú)立空間,只是把實(shí)參的內(nèi)容拷貝一份,放到形參里面去
所以對(duì)形參的修改不會(huì)影響實(shí)參
實(shí)參與形參
實(shí)際參數(shù)(實(shí)參):
- 真實(shí)傳給函數(shù)的參數(shù),叫實(shí)參。
- 實(shí)參可以是:常量、變量、表達(dá)式、函數(shù)等。
- 無(wú)論實(shí)參是何種類(lèi)型的量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須有確定的值,以便把這些值傳送給形參。
形式參數(shù)(形參):
- 形式參數(shù)是指函數(shù)名后括號(hào)中的變量,因?yàn)樾问絽?shù)只有在函數(shù)被調(diào)用的過(guò)程中才實(shí)例化(分配內(nèi)存單元),所以叫形式參數(shù)。
- 形式參數(shù)當(dāng)函數(shù)調(diào)用完成之后就自動(dòng)銷(xiāo)毀了。因此形式參數(shù)只在函數(shù)中有效。
修改
很明顯,剛剛那個(gè)代碼是錯(cuò)誤的,那么如何修改呢?
回想一下剛剛我們寫(xiě)的函數(shù):
- 寫(xiě)了一個(gè)
Swap1
函數(shù),把a、b
的值傳給了x、y
以后,x、y
的空間和a、b
的空間是獨(dú)立的空間 - 所以對(duì)
a、b
的修改是不會(huì)影響x、y
的,它們之間是沒(méi)有建立連接的
我們?cè)賹?xiě)一個(gè)函數(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); //交換兩個(gè)變量 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的地址
取出來(lái)了,放到pa變量
里面去了;
然后我把b的地址
取出來(lái)了,放到pb變量
里面去了;
那么pa
就有能力找到a
,pb
就有能力找到b
那么*pa = a
,*pb = b
再定義了一個(gè)z變量
用于交換*pa
和*pb
傳值和傳址
我們來(lái)看看剛剛寫(xiě)的代碼
#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); //交換兩個(gè)變量 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ù)
的時(shí)候,我把a、b
本身的變量傳到Swap1函數(shù)
,這種方式叫:傳值調(diào)用
當(dāng)我去調(diào)用Swap2函數(shù)
的時(shí)候,我把a、b
的地址傳到Swap2函數(shù)
,這種方式叫:傳址調(diào)用
傳值調(diào)用
函數(shù)的形參和實(shí)參分別占有不同內(nèi)存塊,對(duì)形參的修改不會(huì)影響實(shí)參
傳址調(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語(yǔ)言形參和實(shí)參傳值和傳址詳解刨析的文章就介紹到這了,更多相關(guān)C語(yǔ)言 參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ OpenCV模擬實(shí)現(xiàn)微信跳一跳
這篇文章主要介紹了使用C++和OpenCV模擬實(shí)現(xiàn)微信跳一跳功能,本文圖文并茂通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12C++之普通成員函數(shù)、虛函數(shù)以及純虛函數(shù)的區(qū)別與用法要點(diǎn)
本篇文章主要介紹了C++中的普通成員函數(shù)、虛函數(shù)以及純虛函數(shù),非常的詳細(xì),有需要的朋友可以參考下2015-07-07c語(yǔ)言實(shí)現(xiàn)通訊錄管理系統(tǒng)詳細(xì)實(shí)例
這篇文章主要給大家介紹了關(guān)于c語(yǔ)言實(shí)現(xiàn)通訊錄管理系統(tǒng)的相關(guān)資料,通訊錄管理系統(tǒng)是一種常見(jiàn)的應(yīng)用程序,可以用來(lái)管理聯(lián)系人的信息,包括姓名、電話號(hào)碼、地址等,需要的朋友可以參考下2023-07-07C++實(shí)現(xiàn)教職工信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)教職工信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03VS2010/MFC編程(常用控件:樹(shù)形控件Tree Control控件創(chuàng)建h和實(shí)例)
本篇文章介紹了VS2010/MFC編程:常用控件:樹(shù)形控件Tree Control,包括樹(shù)形控件的創(chuàng)建、CTreeCtrl類(lèi)的主要成員函數(shù)和應(yīng)用實(shí)例有興趣的可以了解一下。2016-12-12C++中fstream,ifstream及ofstream用法淺析
這篇文章主要介紹了C++中fstream,ifstream及ofstream用法,適合C++初學(xué)者學(xué)習(xí)文件流的操作,需要的朋友可以參考下2014-08-08C語(yǔ)言關(guān)于二叉樹(shù)中堆的創(chuàng)建和使用整理
大家好,這里是針對(duì)二叉樹(shù)中堆結(jié)構(gòu)的順序儲(chǔ)存,整理出來(lái)一篇博客供我們一起復(fù)習(xí)和學(xué)習(xí),如果文章中有理解不當(dāng)?shù)牡胤?還希望朋友們?cè)谠u(píng)論區(qū)指出,我們相互學(xué)習(xí),共同進(jìn)步2022-08-08