int y; { }
以上函数的定义是合法的。 int fun(int x,y) { … }
int fun(int x;int y) { … } int fun(int x,y) int y;
{ … }
int fun(x,y) {int x,y; … }
int fun(x,y) int x,y,z; { … }
以上函数的定义均是非法的。
2. 函数的参数和函数值
2.1.函数的参数可以分为:形式参数和实际参数。
形参:函数定义时函数名后小括号内的参数。 实参:函数调用时函数名后小括号内的参数。 注意:
(1)形参只有在该函数被调用时才占内存单元,即该变量才可用;函数调用结束时形参所占的内存单元被释放,即不可用。
(2)实参和形参的数据类型应该对应相同。否则,必须将函数的定义放在函数调用之前或在调用之前对函数作原型声明。 例如:
void sum(int x,int y)//函数定义,x,y 是被调用函数的参数,我们叫它形参 {
printf(“%d”,x+y); }
main( ) {
sum(3,5);//函数调用,这里的3和5是调用函数的参数,我们叫为实参 }/*类型对应不相同*/
2.2.函数值:
函数的返回值即函数值。 return 语句的格式:
retrun 表达式;或return (表达式);
功能:将表达式的值作为函数值返回给主调函数,并结束本函数的执行。 注意:
2.21.函数值应通过return语句返回,一个函数中可以有多条return语句,只要执行其中任何一条return语句,该函数立即结束执行,并将该retrun后表达式的值返回。
例如:int max(int a,int b)
{
if(a>b) return a;
else return b;
}
2.22.函数值的类型保持与函数定义时所指定的类型相同,而与retrun后表达式的值的类型无关。若定义函数时不指定函数的类型,则默认是int。 max(float a,float b) int max(float a,float b) {return a/b;} {return a/b;}
2.23.为了明确函数无返回值,可将函数指定为空类型(void)。 例如:void fun( int a)
{
printf(“%d”,a); }
3.函数调用
调用格式:函数名(实参)
无参调用格式:函数名() clrscr(); 带参调用格式:函数名(实参列表)
3.1调用函数时,函数名必须一致。函数名是唯一区别函数的标志。 3.2实参和形参的类型匹配,个数一致,形式上一一对应。 3.3一般情况下,函数应该先定义后调用。
3.4函数可以直接或者间接调用自己,称为递归调用。 例如:
void swap(int a,int b)/*函数定义*/ {
a=a+b;b=a-b;a=a-b; }
main() {
int a=2,b=5;
swap(a,b);/*函数调用*/ printf(“a=%d,b=%d”,a,b); }
4.函数的原型声明
格式:函数类型 函数名(形参类型1,形参类型2,…); 或
函数类型 函数名(形参类型1 形参名1,形参类型2 形参名2…); 对上例中的swap函数作原型声明的格式: void swap(int,int); void swap(int a,int b); void swap(int x,int y); 注意:
若被调函数定义在主调函数之前时,可以不作原型声明。若被调函数定义在主调函数之后,则在调用前应作原型声明。
例如:
void swap(int a,int b)/*函数定义*/ {a=a+b;b=a-b;a=a-b;} main()
{int a=2,b=5;
swap(a,b);/*函数调用*/ printf(“a=%d,b=%d”,a,b); }
main()
{int a=2,b=5;
void swap(int,int);/*原型声明*/ swap(a,b);/*函数调用*/ printf(“a=%d,b=%d”,a,b); }
void swap(int a,int b)/*函数定义*/ {a=a+b;b=a-b;a=a-b;}
如果在程序文件的开始就对函数作外部原型声明,则在各主调函数中不必再作原型声明。 例:
void swap(int,int);/*外部原型申明*/ main()
{int x=1,y=2; swap(x,y);
swap(x+1,y+1); }
void swap(int a,int b) {……}
补充:若果形参中有数组,则作原型声明时数组的中括号不能省略。 例如:float fun(double b[])
{ }
可以用以下方式原型声明: float fun(double []); float fun(double a[]);
而以下的声明方式是错误的: float fun(double b);
5.函数的嵌套调用和递归调用
嵌套调用:在一个函数内调用另一个函数。
递归调用:在一个函数内直接或间接调用它本身。若在函数A内直接调用函数A称为直接递归。若函数A调用函数B,函数B又调用函数A则称为间接递归调用。 例1:
long fun(int k) {
if(k==1||k==2) return 1;
else return fun(k-1)+fun(k-2); }
main() {
int n;
scanf(“%d”,&n); printf(“%ld”,fun(n)); }
例2:
int func(int a,int b) {
return (a+b); }
main() {
int x=2,y=5,z=8,r; r=func(func(x,y),z); printf(“%d\\n”,r); }
6.函数的参数传递
C语言中,函数参数之间的数据传递仅仅通过实参向形参的单向数据传递,
即‘“值传递“。不能我们不能通过形参的改变来改变实参。 总结:
相关推荐: