- 相關(guān)推薦
C語(yǔ)言函數(shù)參數(shù)傳遞問(wèn)題
在一些C語(yǔ)言教材和參考資料中,常常把函數(shù)參數(shù)傳遞分為“數(shù)值傳遞”和“地址傳遞”兩種方式,這種概念模糊的分類方法給初學(xué)者的理解造成一定程度的困難。下面就由小編為大家介紹一下C語(yǔ)言函數(shù)參數(shù)傳遞問(wèn)題,歡迎大家閱讀!
1、概述
函數(shù)是C語(yǔ)言程序的基本構(gòu)成模塊,通過(guò)使用函數(shù),不僅可以省去重復(fù)代碼的編寫,還可以使程序更加模塊化,從而有利于程序的閱讀、修改和完善。對(duì)于C語(yǔ)言的初學(xué)者來(lái)說(shuō),準(zhǔn)確理解函數(shù)參數(shù)的傳遞方式是難點(diǎn)之一。一些C語(yǔ)言程序設(shè)計(jì)教材[1][2]中把函數(shù)間的參數(shù)傳遞分為“數(shù)值傳遞”和“地址傳遞”兩種方式,這種分類很容易使初學(xué)者混淆概念,更不能抓住參數(shù)傳遞的本質(zhì)。
2、傳遞方式和數(shù)據(jù)類型
“值傳遞”是函數(shù)參數(shù)的唯一傳遞方式。函數(shù)的參數(shù)分為實(shí)際參數(shù)(簡(jiǎn)稱實(shí)參)和形式參數(shù)(簡(jiǎn)稱形參),在定義函數(shù)時(shí)使用的參數(shù)叫形參,在調(diào)用函數(shù)時(shí)使用的參數(shù)叫實(shí)參。實(shí)參可以是常量、變量或表達(dá)式,但要求它們有確定的值。實(shí)參與形參的結(jié)合只有一種方式,即“值傳遞”,把實(shí)參的值賦給形參變量!爸祩鬟f”具有單向性,只能把實(shí)參傳給形參,而不能由形參回傳給實(shí)參。
不同數(shù)據(jù)類型的函數(shù)參數(shù)對(duì)主調(diào)函數(shù)中變量的作用有所不同。函數(shù)參數(shù)可取的數(shù)據(jù)類型為基本類型、構(gòu)造類型、指針類型或空類型,如圖所示?疹愋捅硎驹摵瘮(shù)為無(wú)參函數(shù),在此不作介紹。其余數(shù)據(jù)類型又可分為三類:普通類型,包括基本類型、結(jié)構(gòu)體類型和共用體類型;指針類型;數(shù)組類型。函數(shù)參數(shù)為普通類型時(shí),對(duì)函數(shù)的調(diào)用不用影響到主調(diào)函數(shù)中變量的值;函數(shù)參數(shù)為指針類型或數(shù)組類型時(shí),對(duì)函數(shù)的調(diào)用可以修改主調(diào)函數(shù)中有關(guān)變量的值。
3、普通類型變量作為函數(shù)參數(shù)
普通變量作為函數(shù)參數(shù)時(shí),對(duì)形參的修改不會(huì)影響到實(shí)參。如下例所示,通過(guò)“值傳遞”,形參x保存了實(shí)參a的值,形參y保存了實(shí)參b的值,因?yàn)樾螀⒑蛯?shí)參是相互獨(dú)立的不同變量,所以在swap函數(shù)中對(duì)形參x和y進(jìn)行的交換不會(huì)反映到實(shí)參a和b中。
#include
void swap(int x, int y)
{
int temp;
temp=x; x=y; y=temp;
}
void main()
{
int a, b;
scanf("%d%d", &a, &b);
swap(a, b);
printf("%d %d ", a, b);
}
輸入:1 2
輸出:1 2
4、指針作為函數(shù)參數(shù)
變量的指針就是變量的地址,存放變量地址的變量叫指針變量,定義指針變量的一般形式為:
基類型*指針變量名;
通過(guò)指針變量訪問(wèn)其所指向的變量的方式稱為間接訪問(wèn)方式。如下例所示。
int age;
a=10; //直接訪問(wèn)方式
int* p=&a;
*p=11; //間接訪問(wèn)方式
指針類型作為函數(shù)參數(shù)時(shí),參數(shù)傳遞方式仍然是“值傳遞”,即把實(shí)參的值傳遞給形參。不同的是參數(shù)為指針變量,可以通過(guò)形參的間接訪問(wèn)方式來(lái)讀取或修改主調(diào)函數(shù)中有關(guān)變量的值。
如下例所示,通過(guò)“值傳遞”,形參x保存了變量a的地址,形參y保存了變量b的地址,即x指向變量a,y指向變量b,在swap函數(shù)中通過(guò)間接訪問(wèn)方式交換了變量a和b的值。
#include
void swap(int* x, int* y)
{
int temp;
temp=*x; *x=*y; *y=temp;
}
void main()
{
int a, b;
scanf("%d%d", &a, &b);
swap(&a, &b);
printf("%d %d ", a, b);
}
輸入:1 2
輸出:2 1
5、數(shù)組名作為函數(shù)參數(shù)
數(shù)組元素和數(shù)組名也可以作為函數(shù)參數(shù),數(shù)組元素作為函數(shù)參數(shù)與普通變量用法相同,數(shù)組名作為函數(shù)參數(shù)與指針變量相同。
用數(shù)組名作函數(shù)形參時(shí),指定數(shù)組大小是不起任何作用的。因?yàn)镃語(yǔ)言編譯對(duì)形參數(shù)組大小不做檢查,只是將實(shí)參數(shù)組的首地址傳遞給形參數(shù)組。實(shí)參數(shù)組名即是實(shí)參數(shù)組的首地址,相當(dāng)于指針常量;形參數(shù)組名相當(dāng)于指針變量。實(shí)際上,C編譯都是將形參數(shù)組名作為指針變量來(lái)處理的[3]。所以,數(shù)組名作為函數(shù)參數(shù)可以按指針作為函數(shù)參數(shù)來(lái)理解。
如下例所示,數(shù)組名array代表數(shù)組array的首地址,通過(guò)“值傳遞”,形參數(shù)組名a,也可以理解為形參指針變量a,保存了數(shù)組array的首地址,因此,在swap函數(shù)中對(duì)形參數(shù)組a的操作即是對(duì)實(shí)參數(shù)組array的操作。
#include
void swap(int a[])
{
int temp;
temp=a[0]; a[0]=a[1]; a[1]=temp;
}
void main()
{
int array[2];
scanf("%d%d", &array[0], &array[1]);
swap(array);
printf("%d %d ", array[0], array[1]);
}
輸入:1 2
輸出:2 1
6、結(jié)論
綜上所述,C語(yǔ)言函數(shù)參數(shù)問(wèn)題主要涉及兩個(gè)概念:傳遞方式和數(shù)據(jù)類型。實(shí)參與形參的傳遞方式只有一種,即“值傳遞”。參數(shù)的數(shù)據(jù)類型可以為普通類型、指針類型和數(shù)組類型,數(shù)組類型實(shí)際上是按指針類型來(lái)處理的,所以,主要是指針類型與非指針類型的區(qū)別。對(duì)初學(xué)者來(lái)說(shuō),問(wèn)題的難點(diǎn)在于數(shù)據(jù)類型的不同而非傳遞方式,即指針類型變量與非指針類型變量的區(qū)別。
C語(yǔ)言函數(shù)參數(shù)的含義
函數(shù)(Function)是一段可以重復(fù)使用的代碼,這是從整體上對(duì)函數(shù)的認(rèn)識(shí)。
C語(yǔ)言本身帶了很多庫(kù)函數(shù),并分門別類地放在了不同的頭文件中,使用時(shí)只要引入對(duì)應(yīng)的頭文件即可。
除了C語(yǔ)言自帶的函數(shù),我們也可以編寫自己的函數(shù),稱為自定義函數(shù)(User-Defined Function)。自定義函數(shù)和庫(kù)函數(shù)沒(méi)有本質(zhì)的區(qū)別,表現(xiàn)形式和使用方法一樣,只是開(kāi)發(fā)者不同而已。
這一章我們就來(lái)講解如何編寫和使用自己的函數(shù)。
參數(shù)
函數(shù)的一個(gè)明顯特征就是使用時(shí)帶括號(hào)( ),必要的話,括號(hào)中還要包含數(shù)據(jù)或變量,稱為參數(shù)(Parameter)。參數(shù)是函數(shù)需要處理的數(shù)據(jù),例如:
strlen(str1)用來(lái)計(jì)算字符串的長(zhǎng)度,str1就是參數(shù)。
puts("C語(yǔ)言中文網(wǎng)")用來(lái)輸出字符串,"C語(yǔ)言中文網(wǎng)"就是參數(shù)。
返回值
既然函數(shù)可以處理數(shù)據(jù),那就有必要將處理結(jié)果告訴我們,所以很多函數(shù)都有返回值(Return Value)。所謂返回值,就是函數(shù)的執(zhí)行結(jié)果。例如:
char str1[] = "C Language";
int len = strlen(str1);
strlen() 的處理結(jié)果是字符串 str1 的長(zhǎng)度,是一個(gè)整數(shù),我們通過(guò) len 變量來(lái)接收。
函數(shù)返回值有固定的數(shù)據(jù)類型(int、char、float等),用來(lái)接收返回值的變量類型要一致。
【C語(yǔ)言函數(shù)參數(shù)傳遞問(wèn)題】相關(guān)文章:
C語(yǔ)言函數(shù)參數(shù)傳遞規(guī)律10-12
C語(yǔ)言函數(shù)調(diào)用與參數(shù)傳遞08-05
C語(yǔ)言main函數(shù)的參數(shù)07-25
C語(yǔ)言中編寫可變參數(shù)函數(shù)09-28
關(guān)于淺談C語(yǔ)言函數(shù)調(diào)用參數(shù)壓棧的相關(guān)問(wèn)題11-03