摘 要:函數(shù)是C語言的基本單位,函數(shù)的參數(shù)傳遞采用單向的值傳遞方式。當(dāng)指針作為函數(shù)參數(shù)時(shí),進(jìn)行的是地址傳遞,地址傳遞依然是單向的值傳遞方式,并不是雙向的傳遞方式。使用局部變量的有關(guān)知識(shí),用圖示法分析探討函數(shù)的各種參數(shù)傳遞形式,通過探討,總結(jié)了函數(shù)的參數(shù)傳遞規(guī)律。圖示分析方法是一種全新的分析工具,有一定的推廣價(jià)值。
關(guān)鍵詞:值傳遞;地址傳遞;局部變量;圖示法
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:B 文章編號(hào):1004373X(2008)1608903
Discussion of Parameter Delivery Law Based on C Language Function
YANG Zhanhai,XUE Suqin,ZHANG Xiaoguang
(Computer Center,Yan′an Unversity,Yan′an,716000,China)
Abstract:The function is basical unit of C language,the function parameter delivery adopts transfer way of oneway value.While guiding principle is the function parameter,being in progress is address delivery,as before,address delivery is oneway value transfer way,is really not twoway delivery way.Using relevant part variable knowledge,the various parameter using diagrammatic representation is discussed.By discussion,parameter′s dilivery law of the function is proposed.Graphic analysis method in culture is a kind of brandnew analysis implement,has certain extension value.
Keywords:value delivery;address delivery;part variable;diagrammatic representation metrod
學(xué)習(xí)和使用C語言,都會(huì)遇到函數(shù)的參數(shù)傳遞問題,在編寫的一些程序里,主調(diào)函數(shù)調(diào)用了被調(diào)用函數(shù)后,主調(diào)函數(shù)中的有些變量發(fā)生了變化,尤其是在使用指針的情況下更是如此,基于此點(diǎn),有人誤以為,指針作為函數(shù)參數(shù)時(shí)的地址傳遞是雙向的傳遞方式。
本文以局部變量的概念為基石,采用一種內(nèi)存圖示分析方法。使用該方法,探討了函數(shù)的各種參數(shù)傳遞形式,對(duì)參數(shù)的傳遞規(guī)律進(jìn)行深刻的總結(jié)。
1 自動(dòng)局部變量
自動(dòng)局部變量是函數(shù)內(nèi)部或復(fù)合語句內(nèi)部定義的auto類別的變量,該變量在內(nèi)存的動(dòng)態(tài)區(qū)中開辟,作用范圍僅限于函數(shù)內(nèi)部或復(fù)合語句內(nèi)部,只有函數(shù)或復(fù)合語句能夠識(shí)別自己的自動(dòng)局部變量,即自動(dòng)局部變量對(duì)于其他函數(shù)而言是不可知的、不可見的。
另外,自動(dòng)局部變量的生存期也是非常短暫的,當(dāng)其所在函數(shù)被調(diào)用時(shí),分配內(nèi)存單元,調(diào)用結(jié)束后,釋放變量。在下次調(diào)用函數(shù)時(shí),重新分配內(nèi)存單元。
形式參數(shù)屬于局部變量,作用范圍僅在所定義的函數(shù)中,形參的變化不能被別的函數(shù)可見,包括主調(diào)函數(shù)也不可見。若形式參數(shù)為自動(dòng)局部變量,調(diào)用結(jié)束后根本就不存在了,更不會(huì)被主調(diào)函數(shù)可見。
按照上面的分析,形參絕不可能把自己調(diào)用到主調(diào)函數(shù)里的,所以,函數(shù)的參數(shù)的傳遞應(yīng)該是單向的。
既然局部變量互不干擾,為簡單起見,可以把主調(diào)函數(shù)和被調(diào)用函數(shù)的變量畫在不同的區(qū)域以示區(qū)別。為此,特約定,畫內(nèi)存圖時(shí)以水平線為分界,水平線以下為主調(diào)函數(shù)的局部變量,水平線以上為被調(diào)用函數(shù)的局部變量。
下面,便應(yīng)用以上理論和畫圖的方法分析幾個(gè)典型的程序,用以研究函數(shù)的參數(shù)傳遞規(guī)律。
2 不涉及指針的參數(shù)傳遞
有如下程序,用于交換2個(gè)變量的值。交換的思想是把實(shí)參變量傳遞給形參變量后,交換形參變量的值,希望帶動(dòng)2個(gè)實(shí)參變量的值的改變。
void fun(int a,int b)
{ int t; t = a; a = b; b = t;}
void main(viod)
{ int a = 6,b = 9; fun(a,b); printf (\"%d,%d\\\\",a,b);}
但程序的執(zhí)行結(jié)果并未實(shí)現(xiàn)實(shí)參變量值的交換,這說明形參的變化不能影響實(shí)參的值,傳遞是單向值傳遞的。
下面,便用圖示法進(jìn)行分析探討。
主程序執(zhí)行后,變量及其值如圖1(a)所示。調(diào)用函數(shù)fun后,分配的變量及其值如圖1(b)所示,此時(shí)形參從實(shí)參處獲得了對(duì)應(yīng)的值。
函數(shù)fun中的變量交換,是局部變量的交換,交換結(jié)果如圖2(a)所示。函數(shù)fun調(diào)用結(jié)束后,釋放其所申請(qǐng)的局部變量,結(jié)果如圖2(b)所示。
顯而易見,形參的變化是被調(diào)用函數(shù)內(nèi)部的變化,根本不涉及實(shí)參的變化,值的單向傳遞得到肯定。
3 涉及指針的參數(shù)傳遞
3.1 指針形參的改變
下面的程序采用指針參數(shù),函數(shù)fun進(jìn)行2個(gè)指針參數(shù)變量的值的交換。
void fun(int *p,int *q)
{ int *t; t=p; p=q; q=t;}
void main(void)
{ int a=6,b=9,*p=a,*q=b;
fun(p,q); printf (\"%d,%d\\\\",a,b);}
主程序執(zhí)行后,變量及其值如圖3(a)所示,實(shí)參指針p的值為a,表示指向變量a,實(shí)參指針q的值為b,表示指向變量b。調(diào)用函數(shù)fun后,分配的變量及其值如圖3(b)所示,此時(shí)形參從實(shí)參處獲得了對(duì)應(yīng)的值,其中形參指針p的值為a,表示指向主調(diào)函數(shù)中的變量a,實(shí)參指針q的值為b,表示指向主調(diào)函數(shù)中的變量b。
函數(shù)fun中的p和q交換,是局部變量的交換,交換結(jié)果如圖4(a)所示,p指向了b,q指向了a。函數(shù)fun調(diào)用結(jié)束后,釋放其所申請(qǐng)的局部變量,結(jié)果如圖4(b)所示。
主函數(shù)中p和q是實(shí)參,而調(diào)用函數(shù)fun后,p和q沒有發(fā)生改變,這說明形參的變化沒有改變實(shí)參的指向,即沒有改變實(shí)參的值,指針作參數(shù)時(shí),值的單向傳遞得到了肯定。另外,形參指針p和q曾分別指向主函數(shù)中a和b,而主函數(shù)中a和b也沒有發(fā)生改變,這說明,僅改變形參指針的值,不會(huì)影響主調(diào)函數(shù)中其他變量的值,不能改變其指向變量的值。
3.2 指針形參指向變量的改變
下面的程序采用指針參數(shù),函數(shù)fun進(jìn)行2個(gè)指針參數(shù)指向變量的值的交換。
void fun(int *p,int *q)
{ int t; t=*p; *p=*q; *q=t;}
void main(void)
{ int a=6,b=9,*p=a,*q=b;
fun(p,q); printf (\"%d,%d\\\\",a,b);}
主程序執(zhí)行后,變量及其值如圖5(a)所示,實(shí)參指針p指向變量a,實(shí)參指針q指向變量b。調(diào)用函數(shù)fun后,分配的變量及其值如圖5(b)所示,此時(shí)形參從實(shí)參處獲得對(duì)應(yīng)的值,其中形參指針p指向主調(diào)函數(shù)中的變量a,實(shí)參指針q指向主調(diào)函數(shù)中的變量b。
函數(shù)fun中的*p和*q交換,就是主調(diào)函數(shù)中的變量a和b的交換,交換結(jié)果如圖6(a)所示,主調(diào)函數(shù)中的變量a和b完成了交換。函數(shù)fun調(diào)用結(jié)束后,釋放其所申請(qǐng)的局部變量,結(jié)果如圖6(b)所示。
通過指針形參可以改變其指向變量的值,變量可以是主調(diào)函數(shù)中變量,但這些變量并不是實(shí)參指針變量,實(shí)參的值沒有發(fā)生改變。所以通過指針形參可以改變其指向變量的值并不違背參數(shù)的單向傳遞規(guī)律。
3.3 數(shù)組名作為函數(shù)的參數(shù)
數(shù)組名是地址常量,代表函數(shù)的起始地址,即數(shù)組名是指針類型常量,指向了數(shù)組的起始位置。按照參數(shù)的類型一致原則,形參就應(yīng)該為指針類型變量,該變量得到實(shí)參的傳遞后,指針指向數(shù)組的起始位置。
故數(shù)組名作為函數(shù)的參數(shù)本質(zhì)是指針作參數(shù)的情形,實(shí)際上就是圖5(a),(b)描述的情形。形參指針的變化不會(huì)改變數(shù)組的初始位置,不會(huì)改變數(shù)組名地址常量,指針參數(shù)之間的傳遞遵循單向的值傳遞規(guī)律。形參指針指向的變量就是數(shù)組的內(nèi)存單元,通過形參指針指向的變量的改變可以達(dá)到改變數(shù)組元素值的目標(biāo)。
4 結(jié) 語
C語言函數(shù)參數(shù)的傳遞規(guī)律是單向的傳遞規(guī)律,不論參數(shù)是否是指針,主調(diào)函數(shù)的實(shí)參是不會(huì)改變的。能夠改變的只能是指針指向的變量的改變,在數(shù)組中把這種指針指向的變量的特性稱為共享內(nèi)存單元。指針指向的變量并不是作為實(shí)數(shù)的變量,而是其他的變量,實(shí)參也指向該變量,指向變量的改變并等價(jià)于實(shí)參的改變,地址傳遞并不違背“值傳遞”規(guī)律。
以局部變量的概念為基石,采用內(nèi)存圖示分析方法,是分析和研究參數(shù)傳遞問題的一種新思路、新方法。
參 考 文 獻(xiàn)
[1]古麗孜拉·安尼瓦爾.C語言函數(shù)參數(shù)傳遞的幾個(gè)問題[J].伊犁師范學(xué)院學(xué)報(bào),2004(3):7374.
[2]吳麗賢.C語言中多維數(shù)組指針和遞歸的教學(xué)實(shí)踐[J].電腦知識(shí)與技術(shù):學(xué)術(shù)交流,2007(2):462,464.
[3]張艷華.C語言函數(shù)形參與實(shí)參之間的數(shù)據(jù)傳遞[J].內(nèi)江科技,2007(9):80.
[4][美] Herbert Schildt.最新C語言精華\\.3版.王子恢,譯.北京:電子工業(yè)出版社,1997.
[5]譚浩強(qiáng).C程序設(shè)計(jì)\\.3版.北京:清華大學(xué)出版社,2005.
[6]楊戰(zhàn)海,郭協(xié)潮.基于C語言函數(shù)調(diào)用獲得結(jié)果的分析研究\\.現(xiàn)代電子技術(shù),2007,30(4):102103.
作者簡介 楊戰(zhàn)海 男,1972出生,陜西涇陽人,講師。主要從事計(jì)算機(jī)算法和數(shù)據(jù)庫技術(shù)方面的研究。