摘 要:函數是C語言的基本單位,函數的參數傳遞采用單向的值傳遞方式。當指針作為函數參數時,進行的是地址傳遞,地址傳遞依然是單向的值傳遞方式,并不是雙向的傳遞方式。使用局部變量的有關知識,用圖示法分析探討函數的各種參數傳遞形式,通過探討,總結了函數的參數傳遞規律。圖示分析方法是一種全新的分析工具,有一定的推廣價值。
關鍵詞:值傳遞;地址傳遞;局部變量;圖示法
中圖分類號:TP311 文獻標識碼:B 文章編號: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
學習和使用C語言,都會遇到函數的參數傳遞問題,在編寫的一些程序里,主調函數調用了被調用函數后,主調函數中的有些變量發生了變化,尤其是在使用指針的情況下更是如此,基于此點,有人誤以為,指針作為函數參數時的地址傳遞是雙向的傳遞方式。
本文以局部變量的概念為基石,采用一種內存圖示分析方法。使用該方法,探討了函數的各種參數傳遞形式,對參數的傳遞規律進行深刻的總結。
1 自動局部變量
自動局部變量是函數內部或復合語句內部定義的auto類別的變量,該變量在內存的動態區中開辟,作用范圍僅限于函數內部或復合語句內部,只有函數或復合語句能夠識別自己的自動局部變量,即自動局部變量對于其他函數而言是不可知的、不可見的。
另外,自動局部變量的生存期也是非常短暫的,當其所在函數被調用時,分配內存單元,調用結束后,釋放變量。在下次調用函數時,重新分配內存單元。
形式參數屬于局部變量,作用范圍僅在所定義的函數中,形參的變化不能被別的函數可見,包括主調函數也不可見。若形式參數為自動局部變量,調用結束后根本就不存在了,更不會被主調函數可見。
按照上面的分析,形參絕不可能把自己調用到主調函數里的,所以,函數的參數的傳遞應該是單向的。
既然局部變量互不干擾,為簡單起見,可以把主調函數和被調用函數的變量畫在不同的區域以示區別。為此,特約定,畫內存圖時以水平線為分界,水平線以下為主調函數的局部變量,水平線以上為被調用函數的局部變量。
下面,便應用以上理論和畫圖的方法分析幾個典型的程序,用以研究函數的參數傳遞規律。
2 不涉及指針的參數傳遞
有如下程序,用于交換2個變量的值。交換的思想是把實參變量傳遞給形參變量后,交換形參變量的值,希望帶動2個實參變量的值的改變。
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);}
但程序的執行結果并未實現實參變量值的交換,這說明形參的變化不能影響實參的值,傳遞是單向值傳遞的。
下面,便用圖示法進行分析探討。
主程序執行后,變量及其值如圖1(a)所示。調用函數fun后,分配的變量及其值如圖1(b)所示,此時形參從實參處獲得了對應的值。

函數fun中的變量交換,是局部變量的交換,交換結果如圖2(a)所示。函數fun調用結束后,釋放其所申請的局部變量,結果如圖2(b)所示。

顯而易見,形參的變化是被調用函數內部的變化,根本不涉及實參的變化,值的單向傳遞得到肯定。
3 涉及指針的參數傳遞
3.1 指針形參的改變
下面的程序采用指針參數,函數fun進行2個指針參數變量的值的交換。
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);}
主程序執行后,變量及其值如圖3(a)所示,實參指針p的值為a,表示指向變量a,實參指針q的值為b,表示指向變量b。調用函數fun后,分配的變量及其值如圖3(b)所示,此時形參從實參處獲得了對應的值,其中形參指針p的值為a,表示指向主調函數中的變量a,實參指針q的值為b,表示指向主調函數中的變量b。
函數fun中的p和q交換,是局部變量的交換,交換結果如圖4(a)所示,p指向了b,q指向了a。函數fun調用結束后,釋放其所申請的局部變量,結果如圖4(b)所示。
主函數中p和q是實參,而調用函數fun后,p和q沒有發生改變,這說明形參的變化沒有改變實參的指向,即沒有改變實參的值,指針作參數時,值的單向傳遞得到了肯定。另外,形參指針p和q曾分別指向主函數中a和b,而主函數中a和b也沒有發生改變,這說明,僅改變形參指針的值,不會影響主調函數中其他變量的值,不能改變其指向變量的值。

3.2 指針形參指向變量的改變
下面的程序采用指針參數,函數fun進行2個指針參數指向變量的值的交換。
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);}
主程序執行后,變量及其值如圖5(a)所示,實參指針p指向變量a,實參指針q指向變量b。調用函數fun后,分配的變量及其值如圖5(b)所示,此時形參從實參處獲得對應的值,其中形參指針p指向主調函數中的變量a,實參指針q指向主調函數中的變量b。

函數fun中的*p和*q交換,就是主調函數中的變量a和b的交換,交換結果如圖6(a)所示,主調函數中的變量a和b完成了交換。函數fun調用結束后,釋放其所申請的局部變量,結果如圖6(b)所示。


通過指針形參可以改變其指向變量的值,變量可以是主調函數中變量,但這些變量并不是實參指針變量,實參的值沒有發生改變。所以通過指針形參可以改變其指向變量的值并不違背參數的單向傳遞規律。
3.3 數組名作為函數的參數
數組名是地址常量,代表函數的起始地址,即數組名是指針類型常量,指向了數組的起始位置。按照參數的類型一致原則,形參就應該為指針類型變量,該變量得到實參的傳遞后,指針指向數組的起始位置。
故數組名作為函數的參數本質是指針作參數的情形,實際上就是圖5(a),(b)描述的情形。形參指針的變化不會改變數組的初始位置,不會改變數組名地址常量,指針參數之間的傳遞遵循單向的值傳遞規律。形參指針指向的變量就是數組的內存單元,通過形參指針指向的變量的改變可以達到改變數組元素值的目標。
4 結 語
C語言函數參數的傳遞規律是單向的傳遞規律,不論參數是否是指針,主調函數的實參是不會改變的。能夠改變的只能是指針指向的變量的改變,在數組中把這種指針指向的變量的特性稱為共享內存單元。指針指向的變量并不是作為實數的變量,而是其他的變量,實參也指向該變量,指向變量的改變并等價于實參的改變,地址傳遞并不違背“值傳遞”規律。
以局部變量的概念為基石,采用內存圖示分析方法,是分析和研究參數傳遞問題的一種新思路、新方法。
參 考 文 獻
[1]古麗孜拉·安尼瓦爾.C語言函數參數傳遞的幾個問題[J].伊犁師范學院學報,2004(3):7374.
[2]吳麗賢.C語言中多維數組指針和遞歸的教學實踐[J].電腦知識與技術:學術交流,2007(2):462,464.
[3]張艷華.C語言函數形參與實參之間的數據傳遞[J].內江科技,2007(9):80.
[4][美] Herbert Schildt.最新C語言精華\\.3版.王子恢,譯.北京:電子工業出版社,1997.
[5]譚浩強.C程序設計\\.3版.北京:清華大學出版社,2005.
[6]楊戰海,郭協潮.基于C語言函數調用獲得結果的分析研究\\.現代電子技術,2007,30(4):102103.
作者簡介 楊戰海 男,1972出生,陜西涇陽人,講師。主要從事計算機算法和數據庫技術方面的研究。