C是模塊化程序設計語言
一、函數的定義
一般格式
函數類型 函數名(形參類型說明表)
{
說明部分
語句部分
}
程序舉例
例 空函數
dummy()
{ }
例 無參函數
printstar()
{ printf(“**********\\n”); }
或
printstar(void )
{ printf(“**********\\n”); }
例 有參函數(現代風格)
int max(int x, y)
{ int z;
z=x>y?x:y;
return(z);
}
例 有參函數(傳統風格)
int max(x,y)
int x,y;
{ int z;
z=x>y?x:y;
return(z);
}
二、函數的返回值
返回語句
形式: return(表達式);
或 return 表達式;
或 return;
功能:
使程序控制從被調用函數返回到調用函數中,同時把返值帶給調用函數
說明:
-
函數中可有多個return語句
-
若無return語句,遇}時,自動返回調用函數
-
若函數類型與return語句中表達式值的類型不一致,按前者為準,自動轉換------函數調用轉換
-
void型函數
例 無返回值函數
void swap(int x,int y )
{ int temp;
temp=x;
x=y;
y=temp;
}
三、函數的調用
調用形式
函數名(實參表);
說明:
實參與形參個數相等,類型一致,按順序一一對應
實參表求值順序,因系統而定(TurboC 自右向左)
函數的調用方式
函數語句:
例 printstar();
printf(“Hello,World!\\n”);
函數表達式:
例 m=max(a,b)*2;
函數參數:
例 printf(“%d”,max(a,b));
m=max(a,max(b,c));
對被調用函數要求:必須是已存在的函數
庫函數:
#include<*.h>
用戶自定義函數:函數類型說明
函數說明
一般形式:
函數類型 函數名(形參類型 [形參名],….. );
或 函數類型 函數名();
作用:告訴編譯系統函數類型、參數個數及類型,以便檢驗函數定義與函數說明不同
函數說明位置:程序的數據說明部分(函數內或外)下列情況下,可不作函數說明
- 若函數返值是char或int型,系統自動按int型處理
- 被調用函數定義出現在主調函數之前
有些系統(如BorlandC++)要求函數說明指出函數返值類型和形參類型,并且對void和int型函數也要進行函數說明
四、函數參數及傳遞方式
形參與實參
- 形式參數:定義函數時函數名后面括號中的變量名
- 實際參數:調用函數時函數名后面括號中的表達式
例 比較兩個數并輸出大者
main()
{ int a,b,c;
scanf("%d,%d",&a,&b);
c=max(a,b);
printf("Max is %d",c);
}
max(int x, int y)
{ int z;
z=x>y?x:y;
return(z);
}
說明:
- 實參必須有確定的值
- 形參必須指定類型
- 形參與實參類型一致,個數相同
- 若形參與實參類型不一致,自動按形參類型轉換———函數調用轉換
- 形參在函數被調用前不占內存;函數調用時為形參分配內存;調用結束,內存釋放
參數傳遞方式
方式:函數調用時,為形參分配單元,并將實參的值復制到形參中;調用結束,形參單元被釋放,實參單元仍保留并維持原值
特點:
- 形參與實參占用不同的內存單元
- 單向傳遞
例 交換兩個數
#include
main()
{ int x=7,y=11;
printf("x=%d,\\ty=%d\\n",x,y);
printf("swapped:\\n");
swap(x,y);
printf("x=%d,\\ty=%d\\n",x,y);
}
swap(int a,int b)
{ int temp;
temp=a; a=b; b=temp;
}
五、函數的地址傳遞
方式:函數調用時,將數據的存儲地址作為參數傳遞給形參
特點:
- 形參與實參占用同樣的存儲單元
- “雙向”傳遞
- 實參和形參必須是地址常量或變量
例 交換兩個數
swap(p1,p2)
int *p1,*p2;
{ int p;
p=*p1;
*p1=*p2;
*p2=p;
}
main()
{int a,b;
scanf("%d,%d",&a,&b);
printf(“a=%d,b=%d\\n”,a,b);
printf(“swapped:\\n”);
swap(&a,&b);
printf(”a=%d,b=%d\\n",a,b);
}
六、函數的嵌套與遞歸調用
嵌套調用
C規定:函數定義不可嵌套,但可以嵌套調用函數
例 求三個數中最大數和最小數的差值
#include
int dif(int x,int y,int z);
int max(int x,int y,int z);
int min(int x,int y,int z);
void main()
{ int a,b,c,d;
scanf("%d%d%d",&a,&b,&c);
d=dif(a,b,c);
printf("Max-Min=%d\\n",d);
}
int dif(int x,int y,int z)
{ return max(x,y,z)-min(x,y,z); }
int max(int x,int y,int z)
{ int r;
r=x>y?x:y;
return(r>z?r:z);
}
int min(int x,int y,int z)
{ int r;
r=xreturn(r
遞歸調用
定義:函數直接或間接的調用自身叫函數的遞歸調用
說明
C編譯系統對遞歸函數的自調用次數沒有限制,每調用函數一次,在內存堆棧區分配空間,用于存放函數變量、返回值等信息,所以遞歸次數過多,可能引起堆棧溢出
七、數組作為函數參數
數組元素作函數實參—值傳遞
地址傳遞
- 在主調函數與被調函數分別定義數組,且類型應一致
- 形參數組大小(多維數組第一維)可不指定
- 形參數組名是地址變量
例 兩個數組大小比較
a和b為有10個元素的整型數組
比較兩數組對應元素
變量n,m,k記錄a[i]>b[i], a[i]==b[i],
a[i]k,認為數組a>b
若n<b
若n==k,認為數組a==b
#include
main()
{ int a[10],b[10],i,n=0,m=0,k=0;
printf("Enter array a:\\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("Enter array b:\\n");
for(i=0;i<10;i++)
scanf("%d",&b[i]);
for(i=0;i<10;i++)
{ if(large(a[i],b[i])==1) n=n+1;
else if(large(a[i],b[i])==0) m=m+1;
else k=k+1;
}
/* Output */
}
int large(int x,int y)
{ int flag;
if(x>y) flag=1;
else if(x-1;
else flag=0;
return(flag);
}
例 求學生的平均成績
#include
float average(int stu[10], int n);
void main()
{ int score[10], i;
float av;
printf("Input 10 scores:\\n");
for( i=0; i<10; i++ )
scanf("%d", &score[i]);
av=average(score,10);
printf("Average is:%.2f", av);
}
float average(int stu[10], int n)
{ int i;
float av,total=0;
for( i=0; ireturn av;
}
-
函數
+關注
關注
3文章
4331瀏覽量
62622 -
程序控制
+關注
關注
0文章
14瀏覽量
7084 -
調用函數
+關注
關注
0文章
11瀏覽量
2318
發布評論請先 登錄
相關推薦
評論