秦玉平,冷強(qiáng)奎,李祥納
(1.渤海大學(xué) 工學(xué)院,遼寧 錦州121013;2.渤海大學(xué) 信息科學(xué)與技術(shù)學(xué)院,遼寧 錦州121013;3.北京國(guó)電通網(wǎng)絡(luò)技術(shù)有限公司,北京100761)
關(guān)鍵字:C語(yǔ)言;函數(shù);參數(shù)傳遞;傳遞規(guī)則
C語(yǔ)言是一種功能強(qiáng)大且得到廣泛應(yīng)用的計(jì)算機(jī)高級(jí)語(yǔ)言[1].C語(yǔ)言是高校理工科專業(yè)的必修課程,主要培養(yǎng)學(xué)生C語(yǔ)言應(yīng)用能力和程序設(shè)計(jì)能力[2,3].
一個(gè)C程序由一個(gè)或多個(gè)文件構(gòu)成,每個(gè)文件由一個(gè)或多個(gè)函數(shù)構(gòu)成,每個(gè)函數(shù)完成一個(gè)特定的功能,函數(shù)是構(gòu)成C程序的基本單位.依據(jù)函數(shù)關(guān)系,函數(shù)分為主調(diào)函數(shù)和被調(diào)函數(shù).依據(jù)函數(shù)形式,函數(shù)分為無(wú)參函數(shù)和有參函數(shù).
在調(diào)用有參函數(shù)時(shí),主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞,數(shù)據(jù)傳遞通過(guò)函數(shù)的參數(shù)傳遞實(shí)現(xiàn).函數(shù)參數(shù)何時(shí)傳遞數(shù)據(jù)、函數(shù)參數(shù)怎樣傳遞數(shù)據(jù)、函數(shù)參數(shù)傳遞的是什么數(shù)據(jù)以及如何訪問參數(shù)傳遞的數(shù)據(jù),是學(xué)習(xí)者學(xué)習(xí)C語(yǔ)言函數(shù)時(shí)的難點(diǎn),只有學(xué)懂弄通這些問題,才能編寫出高質(zhì)量功能函數(shù).為使學(xué)習(xí)者能夠快速、熟練掌握函數(shù)參數(shù)傳遞,依據(jù)計(jì)算機(jī)程序設(shè)計(jì)教學(xué)方法[4,5],本文對(duì)每一種類型參數(shù)的傳遞時(shí)間、傳遞操作、傳遞內(nèi)容和數(shù)據(jù)操作分別闡述,并通過(guò)實(shí)例進(jìn)行詳細(xì)解析.
C語(yǔ)言中,定義函數(shù)時(shí)的參數(shù)稱為形式參數(shù),簡(jiǎn)稱形參,調(diào)用函數(shù)時(shí)的參數(shù)稱為實(shí)際參數(shù),簡(jiǎn)稱實(shí)參.形參是變量,每個(gè)形參前面有類型說(shuō)明符.實(shí)參可以是常量、變量和表達(dá)式,實(shí)參前面沒有類型說(shuō)明符.函數(shù)調(diào)用開始,為形參分配存儲(chǔ)單元,函數(shù)調(diào)用結(jié)束,釋放形參占用的存儲(chǔ)單元.參數(shù)傳遞是單向的賦值運(yùn)算,即實(shí)參的值依次對(duì)應(yīng)地傳遞給形參,但形參不能反傳給實(shí)參.參數(shù)傳遞的“值”可以是數(shù)值,也可以是地址,即參數(shù)傳遞有傳值和傳址兩種方式.形參與實(shí)參的數(shù)據(jù)類型要一致,否則賦值非法或按不同類型數(shù)值的賦值規(guī)則自動(dòng)進(jìn)行類型轉(zhuǎn)換.
C語(yǔ)言的數(shù)據(jù)類型有基本類型、構(gòu)造類型、指針類型和空類型四種.其中,基本類型包括整型、實(shí)型、字符型和枚舉型.構(gòu)造類型包括數(shù)組、結(jié)構(gòu)體和共用體.
基本類型數(shù)據(jù)作函數(shù)參數(shù)時(shí),參數(shù)傳遞是傳值方式,形參和實(shí)參占用各自的存儲(chǔ)單元,對(duì)形參值的修改不會(huì)影響實(shí)參值.
【例1】基本類型數(shù)據(jù)作為函數(shù)參數(shù)舉例.
例1中,函數(shù)fun1的功能是交換形參a、b的值.函數(shù)調(diào)用開始,為形參a、b分配存儲(chǔ)單元,同時(shí)進(jìn)行參數(shù)傳遞,即a=x、b=y,見圖1.函數(shù)fun1中對(duì)形參a、b值的修改,沒有影響實(shí)參a、b的值.
基本類型指針作函數(shù)參數(shù)時(shí),參數(shù)傳遞是傳址方式,實(shí)參和實(shí)參指向同一對(duì)象,修改形參指向變量的值就是修改實(shí)參指向變量的值.利用指針引用所指向的變量的方式是“*指針變量”.
【例2】基本類型指針作函數(shù)參數(shù)舉例.
例2中,函數(shù)fun2的功能是交換形參a指向變量和b指向變量的值.函數(shù)調(diào)用開始,為形參a、b分配存儲(chǔ)單元,同時(shí)進(jìn)行參數(shù)傳遞,即a=&x、b=&y,見圖2.此時(shí),*a就是x,*b就是y,交換*a、*b的值,即交換變量x、y的值.
在程序設(shè)計(jì)時(shí),利用基本類型指針作函數(shù)的參數(shù),可以通過(guò)一次函數(shù)調(diào)用得到多個(gè)結(jié)果.
一維基本類型數(shù)組、一維結(jié)構(gòu)體數(shù)組、一維共用體數(shù)組和一維指針數(shù)組都可作為函數(shù)的參數(shù).一維數(shù)組名代表數(shù)組在內(nèi)存中的起始地址,一維數(shù)組作為函數(shù)參數(shù)時(shí),參數(shù)傳遞是傳址方式.由于一維數(shù)組名是常量,不能對(duì)其進(jìn)行賦值運(yùn)算,編譯系統(tǒng)將一維數(shù)組說(shuō)明格式的形參轉(zhuǎn)換為指向數(shù)組元素的指針說(shuō)明格式.函數(shù)調(diào)用時(shí)傳遞給形參的是數(shù)組的首地址,即形參數(shù)組與實(shí)參數(shù)組為同一個(gè)數(shù)組.
例3中,函數(shù)fun3的功能是交換數(shù)組第一個(gè)元素和最后元素的值.編譯時(shí)編譯系統(tǒng)將函數(shù)fun3中的形參說(shuō)明“int x[]”轉(zhuǎn)換為“int*x”.函數(shù)調(diào)用開始,為形參x分配存儲(chǔ)單元,同時(shí)進(jìn)行參數(shù)傳遞,即x=a,見圖3.此時(shí),x[i]與a[i](0≤i≤N-1)表示同一數(shù)組元素,對(duì)形參數(shù)組x操作等同于對(duì)實(shí)參數(shù)組a操作.
二維基本類型數(shù)組、二維結(jié)構(gòu)體數(shù)組、二維共用體數(shù)組和二維指針數(shù)組都可作為函數(shù)的參數(shù).C語(yǔ)言對(duì)二維數(shù)組的處理方法是將其分解成多個(gè)一維數(shù)組,即將每一行看作一個(gè)一維數(shù)組,并按行存儲(chǔ).二維數(shù)組的數(shù)組名代表數(shù)組在內(nèi)存中的起始地址,二維數(shù)組作為函數(shù)參數(shù)時(shí),參數(shù)傳遞是傳址方式.由于二維數(shù)組名是常量,不能對(duì)其進(jìn)行賦值運(yùn)算,編譯系統(tǒng)將二維數(shù)組說(shuō)明格式的形參轉(zhuǎn)換為指向一維數(shù)組的指針說(shuō)明格式.調(diào)用函數(shù)時(shí)傳遞給形參的是數(shù)組的首地址,即形參數(shù)組與實(shí)參數(shù)組是同一個(gè)數(shù)組.
【例4】二維數(shù)組作為函數(shù)參數(shù)舉例.
例4中,函數(shù)fun4的功能是互換二維數(shù)組最大值與最小值的位置.編譯時(shí)編譯系統(tǒng)將函數(shù)fun4中的形參說(shuō)明“int x[M][N]”轉(zhuǎn)換為“int(*x)[N]”.函數(shù)調(diào)用開始,為形參x分配存儲(chǔ)單元,同時(shí)進(jìn)行參數(shù)傳遞,即x=a,見圖4.此時(shí),x[i][j]與a[i][j](0≤i≤M-1,0≤j≤N-1)表示同一數(shù)組元素,對(duì)形參數(shù)組x操作等同于對(duì)實(shí)參數(shù)組a操作.
結(jié)構(gòu)體類型數(shù)據(jù)和共用體類型數(shù)據(jù)都可作函數(shù)的參數(shù),但實(shí)參也必須是變量,其原因是共用體變量不能初始化,結(jié)構(gòu)體變量除初始化外不能整體賦值.結(jié)構(gòu)體和共用體變量作函數(shù)參數(shù)時(shí),參數(shù)傳遞是傳值方式,參數(shù)傳遞形式是一個(gè)賦值運(yùn)算,實(shí)際是多個(gè)賦值運(yùn)算,即將實(shí)參各成員的值依次賦給形參的相應(yīng)成員.由于形參和實(shí)參占用各自的存儲(chǔ)單元,所以對(duì)形參值的修改不會(huì)影響實(shí)參.
【例5】結(jié)構(gòu)體變量作為函數(shù)參數(shù)舉例.
例5中,函數(shù)fun5的功能是輸出結(jié)構(gòu)體變量x各成員的值.函數(shù)調(diào)用開始,為形參x分配存儲(chǔ)單元,同時(shí)進(jìn)行參數(shù)傳遞,即x=a(x.c=a.c,x.h=a.h,scrcpy(x.str,a.str)),見圖5.
結(jié)構(gòu)體(或共用體)指針作函數(shù)參數(shù)時(shí),參數(shù)傳遞是傳址方式,實(shí)參和實(shí)參指向同一變量,修改形參指向變量的成員值就是修改實(shí)參指向變量的成員值.利用結(jié)構(gòu)體(或共用體)指針變量引用結(jié)構(gòu)體變量成員的方式是“指針變量->成員”或“(*指針變量).成員”.
【例6】結(jié)構(gòu)體指針作為函數(shù)參數(shù)舉例.
例6中,函數(shù)fun6的功能是輸出指針變量x指向變量的各成員的值.函數(shù)調(diào)用開始,為形參x分配存儲(chǔ)單元,同時(shí)進(jìn)行參數(shù)傳遞,即x=a,見圖6.此時(shí),是用指針變量x引用變量a的成員.
另外,結(jié)構(gòu)體、共用體的成員和數(shù)組元素都可作為函數(shù)的參數(shù),傳遞方式和數(shù)據(jù)處理與同類型的數(shù)據(jù)相同.
在調(diào)用有參函數(shù)時(shí),先為形參分類存儲(chǔ)單元,同時(shí)進(jìn)行參數(shù)傳遞,然后再執(zhí)行規(guī)定的操作.函數(shù)參數(shù)傳遞規(guī)則是將實(shí)參表達(dá)式的值依次對(duì)應(yīng)地傳給形參表中的各形參變量,即參數(shù)傳遞是單向的賦值運(yùn)算.參數(shù)傳遞信息有兩種,一種是數(shù)值,另一種是地址.傳值時(shí),對(duì)應(yīng)的形參是基本類型、結(jié)構(gòu)體類型或共用體類型的變量,在被調(diào)函數(shù)中對(duì)形參的操作,不會(huì)影響到主調(diào)函數(shù)中的實(shí)參值.傳址時(shí),對(duì)應(yīng)的形參是指針變量,此時(shí),實(shí)參和形參指向同一個(gè)對(duì)象,在被調(diào)函數(shù)中可利用形參修改和訪問實(shí)參指向的對(duì)象.傳址常用于兩種情況,一是通過(guò)一次函數(shù)調(diào)用帶回多個(gè)值,二是在被調(diào)函數(shù)中修改主調(diào)函數(shù)中某些變量的值.