摘要:C語(yǔ)言的模塊設(shè)計(jì)主要是通過(guò)函數(shù)實(shí)現(xiàn)的,函數(shù)間信息的傳遞主要是通過(guò)參數(shù)實(shí)現(xiàn)的。函數(shù)的參數(shù)傳遞包括傳值和傳址。為了區(qū)別兩種傳遞方式的不同,采用實(shí)例和圖示兩種方法,列舉了變量、數(shù)組名、指針作參數(shù)的實(shí)例,通過(guò)比較函數(shù)調(diào)用后形參和實(shí)參的變化,總結(jié)出函數(shù)調(diào)用時(shí)參數(shù)傳遞的兩種規(guī)律,即基類(lèi)型變量、數(shù)組元素、結(jié)構(gòu)體變量作參數(shù)時(shí)是傳值,也就是單向的值傳遞;數(shù)組名、指針作參數(shù)時(shí)是傳址,也就是共享同一個(gè)地址。
關(guān)鍵詞:傳值; 傳址; C語(yǔ)言函數(shù); 地址共享
中圖分類(lèi)號(hào):TN91134; TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1004373X(2012)04005502
Parameter delivery law of C language function
ZHAO Juan1, FAN Chao2
(1. North Institute of Information Engineering, Xi’an Technological University, Xi’an 710025, China;
2. Shaanxi Youth Vocational College, Xi’an 710068, China)
Abstract: C language module design is implemented mainly through the function. The information between the functions is delivered by parameters. The parameter delivery of the function includes the delivery value and delivery address. In order to distinguish the difference of the two modes, two methods of examples and illustrations are adopted. The instances which takes variable, array name and pointer as parameters are listed. By comparing the variation of formal parameter and actual parameter after function call, two laws of the parameter delivery, while the function was called, were summed up: the base type variable, array element and structure variables as parameters are passed by value, that is, they deliver information in one way; the array name and pointer as parameters are passed by address, that is, they share the same address.
Keywords: delivery value; delivery address; C language function; address sharing
收稿日期:20110926在程序設(shè)計(jì)中常采用模塊設(shè)計(jì)方法,實(shí)際上所謂模塊設(shè)計(jì)的思想是一種“分而治之”的思想,把一個(gè)大任務(wù)分為若干個(gè)子任務(wù),這樣每一個(gè)子任務(wù)就相對(duì)簡(jiǎn)單了。程序中的子任務(wù)在C語(yǔ)言中通常是用函數(shù)來(lái)實(shí)現(xiàn)的。通過(guò)函數(shù)間的相互調(diào)用來(lái)完成程序的主要任務(wù)。參數(shù)是實(shí)現(xiàn)函數(shù)間信息傳遞的主要通道,因此掌握參數(shù)的傳遞方式,把握函數(shù)間的傳遞規(guī)律是學(xué)習(xí)C語(yǔ)言的關(guān)鍵。
1參數(shù)的傳遞方式
C語(yǔ)言函數(shù)的參數(shù)傳遞可以歸納為兩種方式:傳值和傳址。下面用實(shí)例和圖示兩種方式進(jìn)行描述。
1.1傳值
傳值傳遞方式主要出現(xiàn)在實(shí)參和形參都是變量的時(shí)候,如基類(lèi)型變量、數(shù)組元素、結(jié)構(gòu)體變量作參數(shù)時(shí),進(jìn)行的就是值傳遞,程序如下:
在上述的例子中,函數(shù)調(diào)用時(shí)如圖1(a)所示。實(shí)參將值傳給形參,形參在子函數(shù)里發(fā)生互換,但不能將互換的值傳回給實(shí)參,結(jié)果如圖1(b)所示。因此實(shí)參在整個(gè)過(guò)程中沒(méi)有發(fā)生變化,由此可以總結(jié)當(dāng)用普通變量作參數(shù)時(shí),進(jìn)行的是單向的值傳遞,只能實(shí)參傳形參,形參無(wú)法傳實(shí)參。
圖1變量作參數(shù)的調(diào)用過(guò)程1.2傳址
該方法中函數(shù)調(diào)用時(shí)參數(shù)間傳遞的地址有以下3種情況:變量的地址作參數(shù)、數(shù)組名作參數(shù)以及指針作參數(shù)。由于變量的地址作參數(shù)與指針作參數(shù)類(lèi)似,這里就不再舉例,主要針對(duì)數(shù)組名作參數(shù)和指針作參數(shù)進(jìn)行探討。
1.2.1數(shù)組名作參數(shù)
數(shù)組名作參數(shù)的程序如下:
void f(int t[],int n)
{int i; for(i=0;i void main() { int a[4]={1,2,3,4},i; f(a,4); for(i=0;i<4;i++) printf(“%d ”,a[i]);} 數(shù)組名作參數(shù)時(shí),傳遞的是數(shù)組的首地址,即實(shí)參數(shù)組和形參數(shù)組共用一段內(nèi)存空間,如圖2(a)所示。在子函數(shù)中對(duì)數(shù)組t的所有元素進(jìn)行賦值,其實(shí)也就是對(duì)數(shù)組a的所有元素進(jìn)行賦值,如圖2(b)所示。所以當(dāng)用數(shù)組名作參數(shù)時(shí),實(shí)參和形參共享一個(gè)數(shù)組,形參數(shù)組的改變也就是實(shí)參數(shù)組的改變,其程序如下: void swap(int *a, int *b) {int temp; temp=*a;*a=*b;*b=temp;} main() {int x=3, y=5, *p=x, *q=y; swap(p,q); printf(\"%d,%d\",*p,*q);} 圖2數(shù)組名作參數(shù)的調(diào)用過(guò)程1.2.2指針作參數(shù) 指針作參數(shù)與數(shù)組名作參數(shù)類(lèi)似,傳遞的也是地址,但此時(shí)不是共享一個(gè)數(shù)組,而是共享一個(gè)變量的地址,即實(shí)參指針和形參指針共同指向同一個(gè)變量,共享同一個(gè)變量地址如圖3所示。這時(shí)有2種情況:改變形參的指向;改變形參所指向的變量。上面的例子屬于第二種情況,形參指向的變量值發(fā)生變化,也就是實(shí)參指向的變量值發(fā)生變化。把此例稍做修改得如下程序: void swap(int *a,int *b) {int *temp; temp=a; a=b; b=temp;} 將函數(shù)稍做改動(dòng)后,子函數(shù)的功能只是改變了形參指針的指向,如圖4(c)所示。對(duì)實(shí)參并無(wú)影響,從而也不會(huì)影響實(shí)參所指向的變量值。 2結(jié)語(yǔ) 調(diào)用函數(shù)時(shí),從參數(shù)的傳遞情況來(lái)看,其實(shí)質(zhì)就是傳值和傳址,傳值是變量作參數(shù),實(shí)參只負(fù)責(zé)給形參賦初值,形參在整個(gè)過(guò)程中的改變都不影響實(shí)參,所以是單向的值傳遞。傳址是數(shù)組名和指針作參數(shù),此時(shí)體現(xiàn)的就是共享,數(shù)組名作參數(shù),實(shí)參和形參共享一個(gè)數(shù)組,形參數(shù)組的改變就是實(shí)參數(shù)組的改變;指針作參數(shù)共享的是同一個(gè)變量的地址,即實(shí)參和形參共同指向同一個(gè)變量,當(dāng)改變形參所指向的變量值時(shí),實(shí)參所指向的變量值也一同改變,因?yàn)樗鼈冎赶虻氖峭粋€(gè)變量。如果改變的是形參的指向,則不影響實(shí)參指針的改變。 圖3指針作參數(shù)的調(diào)用過(guò)程1圖4指針作參數(shù)的調(diào)過(guò)過(guò)程2參考文獻(xiàn) [1]譚浩強(qiáng).C程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2005. [2]楊戰(zhàn)海,薛蘇秦,張曉光.基于C語(yǔ)言函數(shù)參數(shù)傳遞規(guī)律的探討[J].現(xiàn)代電子技術(shù),2008,31(16):8991. [3]馬新.C語(yǔ)言函數(shù)間參數(shù)傳遞機(jī)制的探討[J].白城師范學(xué)院學(xué)報(bào),2008(6):2627. [4]王英存.C語(yǔ)言教學(xué)中函數(shù)參數(shù)傳遞難點(diǎn)探討[J].中國(guó)商界,2010(9):258259. [5]李寅杰.C語(yǔ)言函數(shù)中的三類(lèi)形參[J].遼寧師專(zhuān)學(xué)報(bào):自然科學(xué)版,2007(3):5254. [6]張艷華.C語(yǔ)言函數(shù)形參與實(shí)參之間的數(shù)據(jù)傳遞[J].內(nèi)江科技,2007(9):80. [7]張?bào)慵t,李軍宇,高喜民.C語(yǔ)言函數(shù)形參與實(shí)參之間的數(shù)據(jù)傳遞[J].平頂山工學(xué)院學(xué)報(bào),2002(3):5152. [8]王曉青.C語(yǔ)言函數(shù)調(diào)用時(shí)的參數(shù)變化[J].青海大學(xué)學(xué)報(bào):自然科學(xué)版,1998(1):5558. [9]古麗孜拉·安尼瓦爾.C語(yǔ)言函數(shù)參數(shù)傳遞的幾個(gè)問(wèn)題[J]. 伊犁師范學(xué)院學(xué)報(bào),2004(3):7374. [10]楊戰(zhàn)海,郭協(xié)潮.基于C語(yǔ)言函數(shù)調(diào)用獲得結(jié)果的分析研究[J].現(xiàn)代電子技術(shù),2007,30(24):102103.