函數(shù)定義的一般形式 1.無(wú)參函數(shù)的一般形式 類型說(shuō)明符 函數(shù)名() { 類型說(shuō)明 語(yǔ)句 } 其中類型說(shuō)明符和函數(shù)名稱為函數(shù)頭。 類型說(shuō)明符指明了本函數(shù)的類型,函數(shù)的類型實(shí)際上是函數(shù)返回值的類型。 該類型說(shuō)明符與第二章介紹的各種說(shuō)明符相同。 函數(shù)名是由用戶定義的標(biāo)識(shí)符,函數(shù)名后有一個(gè)空括號(hào),其中無(wú)參數(shù),但括號(hào)不可少。{} 中的內(nèi)容稱為函數(shù)體。在函數(shù)體中也有類型說(shuō)明, 這是對(duì)函數(shù)體內(nèi)部所用到的變量的類型說(shuō)明。在很多情況下都不要求無(wú)參函數(shù)有返回值, 此時(shí)函數(shù)類型符可以寫為void。 我們可以改為一個(gè)函數(shù)定義: void Hello() { printf ("Hello,world \n"); } 這里,只把main改為Hello作為函數(shù)名,其余不變。Hello 函數(shù)是一個(gè)無(wú)參函數(shù),當(dāng)被其它函數(shù)調(diào)用時(shí),輸出Hello world字符串。 2.有參函數(shù)的一般形式 類型說(shuō)明符 函數(shù)名(形式參數(shù)表) 型式參數(shù)類型說(shuō)明 { 類型說(shuō)明 語(yǔ)句 } 有參函數(shù)比無(wú)參函數(shù)多了兩個(gè)內(nèi)容,其一是形式參數(shù)表, 其二是形式參數(shù)類型說(shuō)明。在形參表中給出的參數(shù)稱為形式參數(shù), 它們可以是各種類型的變量, 各參數(shù)之間用逗號(hào)間隔。在進(jìn)行函數(shù)調(diào)用時(shí),主調(diào)函數(shù)將賦予這些形式參數(shù)實(shí)際的值。 形參既然是變量,當(dāng)然必須給以類型說(shuō)明。例如,定義一個(gè)函數(shù), 用于求兩個(gè)數(shù)中的大數(shù),可寫為: int max(a,b) int a,b; { if (ab) return a; else return b; } 第一行說(shuō)明max函數(shù)是一個(gè)整型函數(shù),其返回的函數(shù)值是一個(gè)整數(shù)。形參為a,b。第二行說(shuō)明a,b均為整型量。 a,b 的具體值是由主調(diào)函數(shù)在調(diào)用時(shí)傳送過(guò)來(lái)的。在{}中的函數(shù)體內(nèi), 除形參外沒(méi)有使用其它變量,因此只有語(yǔ)句而沒(méi)有變量類型說(shuō)明。 上邊這種定義方法稱為“傳統(tǒng)格式”。 這種格式不易于編譯系統(tǒng)檢查,從而會(huì)引起一些非常細(xì)微而且難于跟蹤的錯(cuò)誤。ANSI C 的新標(biāo)準(zhǔn)中把對(duì)形參的類型說(shuō)明合并到形參表中,稱為“現(xiàn)代格式”。 例如max函數(shù)用現(xiàn)代格式可定義為: int max(int a,int b) { if(ab) return a; else return b; } 現(xiàn)代格式在函數(shù)定義和函數(shù)說(shuō)明(后面將要介紹)時(shí), 給出了形式參數(shù)及其類型,在編譯時(shí)易于對(duì)它們進(jìn)行查錯(cuò), 從而保證了函數(shù)說(shuō)明和定義的一致性。例1.3即采用了這種現(xiàn)代格式。 在max函數(shù)體中的return語(yǔ)句是把a(bǔ)(或b)的值作為函數(shù)的值返回給主調(diào)函數(shù)。有返回值函數(shù)中至少應(yīng)有一個(gè)return語(yǔ)句。 在C程序中,一個(gè)函數(shù)的定義可以放在任意位置, 既可放在主函數(shù)main之前,也可放在main之后。例如例1.3中定義了一個(gè)max 函數(shù),其位置在main之后, 也可以把它放在main之前。 修改后的程序如下所示。 int max(int a,int b) { if(ab)return a; else return b; } void main() { int max(int a,int b); int x,y,z; printf("input two numbers:\n"); scanf("%d%d",x,y); z=max(x,y); printf("maxmum=%d",z); } 現(xiàn)在我們可以從函數(shù)定義、 函數(shù)說(shuō)明及函數(shù)調(diào)用的角度來(lái)分析整個(gè)程序,從中進(jìn)一步了解函數(shù)的各種特點(diǎn)。程序的第1行至第5行為max函數(shù)定義。進(jìn)入主函數(shù)后,因?yàn)闇?zhǔn)備調(diào)用max函數(shù),故先對(duì)max函數(shù)進(jìn)行說(shuō)明(程序第8行)。函數(shù)定義和函數(shù)說(shuō)明并不是一回事,在后面還要專門討論。 可以看出函數(shù)說(shuō)明與函數(shù)定義中的函數(shù)頭部分相同,但是末尾要加分號(hào)。程序第12 行為調(diào)用max函數(shù),并把x,y中的值傳送給max的形參a,b。max函數(shù)執(zhí)行的 結(jié)果 (a或b)將返回給變量z。最后由主函數(shù)輸出z的值。 函數(shù)調(diào)用的一般形式前面已經(jīng)說(shuō)過(guò),在程序中是通過(guò)對(duì)函數(shù)的調(diào)用來(lái)執(zhí)行函數(shù)體的,其過(guò)程與其它語(yǔ)言的子程序調(diào)用相似。C語(yǔ)言中, 函數(shù)調(diào)用的一般形式為: 函數(shù)名(實(shí)際參數(shù)表) 對(duì)無(wú)參函數(shù)調(diào)用時(shí)則無(wú)實(shí)際參數(shù)表。 實(shí)際參數(shù)表中的參數(shù)可以是常數(shù),變量或其它構(gòu)造類型數(shù)據(jù)及表達(dá)式。 各實(shí)參之間用逗號(hào)分隔。'Next of Page在C語(yǔ)言中,可以用以下幾種方式調(diào)用函數(shù): 1.函數(shù)表達(dá)式 函數(shù)作表達(dá)式中的一項(xiàng)出現(xiàn)在表達(dá)式中,以函數(shù)返回值參與表達(dá)式的運(yùn)算。這種方式要求函數(shù)是有返回值的。例如: z=max(x,y)是一個(gè)賦值表達(dá)式,把max的返回值賦予變量z。'Next of Page 2.函數(shù)語(yǔ)句 函數(shù)調(diào)用的一般形式加上分號(hào)即構(gòu)成函數(shù)語(yǔ)句。例如: printf ("%D",a);scanf ("%d",b);都是以函數(shù)語(yǔ)句的方式調(diào)用函數(shù)。 3.函數(shù)實(shí)參 函數(shù)作為另一個(gè)函數(shù)調(diào)用的實(shí)際參數(shù)出現(xiàn)。 這種情況是把該函數(shù)的返回值作為實(shí)參進(jìn)行傳送,因此要求該函數(shù)必須是有返回值的。例如: printf("%d",max(x,y)); 即是把max調(diào)用的返回值又作為printf函數(shù)的實(shí)參來(lái)使用的。在函數(shù)調(diào)用中還應(yīng)該注意的一個(gè)問(wèn)題是求值順序的問(wèn)題。 所謂求值順序是指對(duì)實(shí)參表中各量是自左至右使用呢,還是自右至左使用。 對(duì)此, 各系統(tǒng)的規(guī)定不一定相同。在3.1.3節(jié)介紹printf 函數(shù)時(shí)已提 到過(guò),這里從函數(shù)調(diào)用的角度再?gòu)?qiáng)調(diào)一下。 看例5.2程序。 void main() { int i=8; printf("%d\n%d\n%d\n%d\n",++i,--i,i++,i--); } 如按照從右至左的順序求值。例5.2的運(yùn)行結(jié)果應(yīng)為: 8 7 7 8 如對(duì)printf語(yǔ)句中的++i,--i,i++,i--從左至右求值,結(jié)果應(yīng)為: 9 8 8 9 應(yīng)特別注意的是,無(wú)論是從左至右求值, 還是自右至左求值,其輸出順序都是不變的, 即輸出順序總是和實(shí)參表中實(shí)參的順序相同。由于Turbo C現(xiàn)定是自右至左求值,所以結(jié)果為8,7,7,8。上述問(wèn)題如還不理解,上機(jī)一試就明白了。函數(shù)的參數(shù)和函數(shù)的值 一、函數(shù)的參數(shù) 前面已經(jīng)介紹過(guò),函數(shù)的參數(shù)分為形參和實(shí)參兩種。 在本小節(jié)中,進(jìn)一步介紹形參、實(shí)參的特點(diǎn)和兩者的關(guān)系。 形參出現(xiàn)在函數(shù)定義中,在整個(gè)函數(shù)體內(nèi)都可以使用, 離開(kāi)該函數(shù)則不能使用。實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用。 形參和實(shí)參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調(diào)用時(shí), 主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。 函數(shù)的形參和實(shí)參具有以下特點(diǎn): 1.形參變量只有在被調(diào)用時(shí)才分配內(nèi)存單元,在調(diào)用結(jié)束時(shí), 即刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。 函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量。 2.實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等, 無(wú)論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須具有確定的值, 以便把這些值傳送給形參。 因此應(yīng)預(yù)先用賦值,輸入等辦法使實(shí)參獲得確定值。 3.實(shí)參和形參在數(shù)量上,類型上,順序上應(yīng)嚴(yán)格一致, 否則會(huì)發(fā)生“類型不匹配”的錯(cuò)誤。 4.函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的。 即只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參。 因此在函數(shù)調(diào)用過(guò)程中,形參的值發(fā)生改變,而實(shí)參中的值不會(huì)變化。例5.3可以說(shuō)明這個(gè)問(wèn)題。 void main() { int n; printf("input number\n"); scanf("%d",n); s(n); printf("n=%d\n",n); } int s(int n) { int i; for(i=n-1;i=1;i--) n=n+i; printf("n=%d\n",n); } 本程序中定義了一個(gè)函數(shù)s,該函數(shù)的功能是求∑ni=1i 的值。在主函數(shù)中輸入n值,并作為實(shí)參,在調(diào)用時(shí)傳送給s 函數(shù)的形參量n( 注意,本例的形參變量和實(shí)參變量的標(biāo)識(shí)符都為n, 但這是兩個(gè)不同的量,各自的作用域不同)。 在主函數(shù)中用printf 語(yǔ)句輸出一次n值,這個(gè)n值是實(shí)參n的值。在函數(shù)s中也用printf 語(yǔ)句輸出了一次n值,這個(gè)n值是形參最后取得的n值0。從運(yùn)行情況看,輸入n值為100。即實(shí)參n的值為100。把此值傳給函數(shù)s時(shí),形參 n 的初值也為100,在執(zhí)行函數(shù)過(guò)程中,形參n的值變?yōu)?050。 返回主函數(shù)之后,輸出實(shí)參n的值仍為100??梢?jiàn)實(shí)參的值不隨形參的變化而變化。
創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設(shè)、成都做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)婺源,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18980820575
是由你定義函數(shù)時(shí)所定義的函數(shù)的類型決定的。
也就是說(shuō)函數(shù)是什么類型,返回值就是什么類型。
比如:
函數(shù)定義? int fun(int a,char b)。
返回值就是整型。
函數(shù)定義? int *fun(int a)。
返回值就是基類型為整型的指針。
函數(shù)定義? void fun(int a)。
無(wú)返回值。
簡(jiǎn)介
在調(diào)用函數(shù)時(shí),如果需要從被調(diào)函數(shù)返回一個(gè)值供主調(diào)函數(shù)使用,那么返回值類型必須定義成非 void 型。此時(shí)被調(diào)函數(shù)中必須包含 return 語(yǔ)句,而且 return 后面必須要有返回值,否則就是語(yǔ)法錯(cuò)誤。
一個(gè)函數(shù)中可以有多個(gè) return 語(yǔ)句,但并不是所有的 return 語(yǔ)句都起作用。執(zhí)行到哪個(gè) return 語(yǔ)句,就是哪個(gè) return 語(yǔ)句起作用,該 return 語(yǔ)句后的其他語(yǔ)句都不會(huì)執(zhí)行。
函數(shù)的返回類型是在函數(shù)聲明的時(shí)候給出的,比方如下
int function1(int a, int b); //兩個(gè)函數(shù)的聲明
float function2(float a, float b);
main(){ //主函數(shù)
int x=8, y=9, z;
float u=3.5, v=2.5, w;
z=function1(x,y);
w=function2(u,v);
}
int function1(int a, int b){ //兩個(gè)函數(shù)的定義
int c;
c=a+b;
return c; //函數(shù)返回值必須與函數(shù)之前的數(shù)據(jù)類型一致, 此處c和function1都是int
}
float function2(float a, float b){
float c;
c=a*b;
return c; //函數(shù)返回值必須與函數(shù)之前的數(shù)據(jù)類型一致, 此處c和function2都是float
}
在c語(yǔ)言中用沒(méi)有函數(shù)判定一個(gè)變量的類型,可以使用sizeof來(lái)判斷變量大小。
示例:
#include stdio.h
#include stdlib.h
int main(int argc,char **argv)? ? ? ? ?//主程序
{
//對(duì)C語(yǔ)言內(nèi)置類型的所占字節(jié)數(shù)的測(cè)試
printf("size of char is: %d\n",sizeof(char));? ? ? ?//字符型數(shù)據(jù)所占字節(jié)數(shù) 、
printf("size of short is: %d\n",sizeof(short));? ? ?//短整形數(shù)據(jù)所占字節(jié)數(shù)
printf("size of int is: %d\n",sizeof(int ));? ? ? ? //整形數(shù)據(jù)
printf("size of short int is: %d\n",sizeof(short int)); //短整形
printf("size of long int is: %d\n",sizeof(long int));? ? //長(zhǎng)整形數(shù)據(jù)
printf("size of float is: %d\n",sizeof(float));? ? ? ? ? //浮點(diǎn)型數(shù)據(jù)
printf("size of double is: %d\n",sizeof(double));? ? ? ? //雙精度數(shù)據(jù)
//對(duì)字符及字符串?dāng)?shù)組所占字節(jié)數(shù)的測(cè)量
char a[] ={'a','b','c','d','e'};
printf("size of a[] is: %d\n",sizeof(a));? ? ? ? ? ? ? ?//輸出數(shù)組a[]所占字節(jié)數(shù)
char b[]={"abcde"};? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//初始化字符串b
printf("size of b[] is: %d\n",sizeof(b));? ? ? ? ? ? ? ?//數(shù)組b[]
char c[][3]={{'a','b','c'},{'d','e','f'},{'g','h','i'},{'j','k','l'}};? //初始化二維字符型數(shù)組
printf("size of c[][] is: %d\n",sizeof(c));? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//二維數(shù)組c所占字節(jié)數(shù)
printf("size of c[0] is: %d\n",sizeof(c[0]));? ? ? ? ? ? ? ? ? ? ? ? ? ?//二維數(shù)組中的某行所占的字節(jié)數(shù),例如第0行
printf("size of c[0][0] is: %d\n",sizeof(c[0][0]));? ? ? ? ? ? ? ? ? ? ?//某行某個(gè)元素,例如第0行第0個(gè)元素
//對(duì)指針?biāo)甲止?jié)數(shù)的測(cè)量
char *p=0;
printf("size of *p is: %d\n",sizeof(p));? ? ? ? ? ? ? ? ? ? ? ?//字符型指針
system("pause");
return 0;
}
擴(kuò)展資料
使用sizeof()計(jì)算數(shù)組長(zhǎng)度
將sizeof用于 expr是并沒(méi)有計(jì)算expr的值。特別是在sizeof *p中,指針p可以是一個(gè)無(wú)效地址,因?yàn)椴恍枰獙?duì)p做解引用操作。
對(duì)char類型或值為char類型的表達(dá)式做sizeof操作結(jié)果為1。對(duì)引用類型做sizeof操作,將返回存放此引用類型對(duì)象所需的內(nèi)存空間大小。
對(duì)指針做sizeof操作,將返回存放指針?biāo)璧膬?nèi)存大小,注意,如果要獲取該指針指向?qū)ο蟮拇笮?,則必須對(duì)該指針進(jìn)行解引用。對(duì)數(shù)組做sizeof操作等效于對(duì)其元素做sizeof操作的結(jié)果乘上數(shù)組元素的個(gè)數(shù)。
因?yàn)閟izeof返回整個(gè)數(shù)組在內(nèi)存中的存儲(chǔ)長(zhǎng)度,所以用sizeof數(shù)組的結(jié)果初一sizeof其元素類型的結(jié)果,即可求出數(shù)組元素的個(gè)數(shù):int sz = sizeof(ia)/sizeof(*ia);
通常將8位的塊作為一個(gè)字節(jié),32位或4個(gè)字節(jié)作為一個(gè) “字”。一般的short為半個(gè)機(jī)器字長(zhǎng),int為一個(gè)機(jī)器字長(zhǎng)。