- 函数的定义
- 函数的调用
- 函数参数
- 函数的类型
- 函数的返回值
- 嵌套调用
- 递归调用
- 数组作函数参数
- 局部变量和全局变量及其作用域
- 动态变量与静态变量
函数定义的一般形式函数类型 函数名(类型名 形式参数1,……) { 说明语句 执行语句 }
没有形式参数的函数称为无参函数
例如:求两个数的最大值。
int max(int x,int 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);
}
如下这样定义是错误的
int max(x,y)
{
int x,y;
……
//或
int max(int x,y)
{……}
//或
int max(x,y)
int x,y,z;
{
z=x>y?x:y;
return (z);
}
函数的调用
- 函数调用的一般形式:
函数名(实参表列)
- 函数调用的方式
- 函数语句如:printstar();
- 函数表达式如:c=max(c,max(a,b));
- 函数参数如:m=max(c,max(a,b));
- 在调用函数时,应对被调用函数作说明,其格式一般如下:
函数类型 函数名(类型 形参,类型 形参);
C语言同时又规定,在以下2种情况下,可以省去对被调函数的说明:
(1)函数的值是整型或字符型。
(2)当被调用函数的函数定义出现在调用函数之前时。
① 当函数被调用时才给形参分配内存单元。调用结束,所占内存被释放。
② 实参可以是常量、变量或表达式,但要求它们有确定的值。
③ 实参与形参类型要一致;个数要相等
④ 在函数调用时,实参的值赋给与之相对应的形参。“单向值传递”。
例题1
编一程序,将主函数中的两个变量的值传递给swap函数中的两个形参,交换两个形参的值
void swap(int x,int y)
{
int z;
z=x;x=y;y=z;
printf("nx=%d,y=%d",x,y);
}
main()
{
int a=10,b=20;
swap(a,b);
printf("na=%d,b=%dn"a,b);
}
程序输出结果:
x=20,y=10
a=10,b=10
例题2:输出两个数中的大数
int max(int x,int y)
{
int z;
z=x>y?x;y;
return(z);//返回z的值
}
main()
{
int a,b,c;
scanf("%d,%d",&a,&b);
c=max(a,b);
printf("max is %dn",c);
}
说明:
①函数的类型决定了函数返回值的类型。若省略函数的类型,系统默认其为int型。
②无返回值的函数应将其类型定义为void (空)类型。
函数的返回值是通过return语句带回到主调函数的
- return语句格式:
return(表达式);或return表达式;
功能:终止函数的运行,返回主调函数。若有返回值,将返回值带回主调函数。
说明:① 若函数没有返回值,return语句可以省略。② return语句中的表达式类型一般应和函数的类型一致,如果不一致,系统自动将表达式类型转换为函数类型。
main()
{
float a,b;
int c;
scanf("%f,%f",&a,&b);
c=max(a,b);
printf("max is %d",c);
}
int max(float x,float y)
{
float z;
z=x>y?x:y;
return(z);
}
输入:2.5,3.8
运行结果:max is 3
例题3:求表达式的值:s=1234…*n
main()
{
int m;
long t,jc(int n);
printf("please input m:");
scanf("%D",&m);
t=jc(m);
printf("s=%ld",t);
}
long jc(n)
int n;
{
int i;
long s=1;
for (i=1;i<=n;i++)
s=s*i;
return(s);
}
嵌套调用
main函数调用函数A
函数A调用函数B
例题4:计算s=22!+32!
long f1(int p)
{
int k;
long r;
long f2(int);
k=p*p;
r=f2(k);
return r;
}
long f2(int q)
{
long c=1;
int i;
for(i=1;i<=q;i++)
c+c*i;
return c;
}
main()
{
int i;
long s=0;
for(i=2;i<=3;i++)
s=s+f1(i);
printf("ns=%ldn",s);
}
递归调用
一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。
例题5:编一递归函数求n!
思路:n!=n*(n-1)! ,(n-1)!=(n-1)*(n-2)!
递归结束条件:当n=1,0时,n!=1
float fact(int n)
{
float f;
if(n<0)
{
printf("n<0,error!");
f=0;}
else if(n==0||n==1)
f=1;
else f=fact(n-1)*n;
return(f);
}
main()
{
int n;float y;
printf("nInput n:");
scanf("%d",&n);
y=fact(n);
printf("%d!=%fn"n,y);
}
运行情况如下:
Input :4
4!=24
- 数组元素作函数实参——值传递
- 数组名做函数参数——地址传递
在主调函数与被调函数分别定义数组,且类型应一致,形参数组大小可不指定。
void swap(int x[2])
{
int z;
z=x[0];x[0]=x[1];z[1]=z;
}
main()
{
int a[2]={1,2};
swap(a);
printf("a[0]=%dna[1]=%dn",a[0],a[1]);
}
例题6:求10个学生的平均成绩
float average(float a[],int n)
{
int i;
float aver,sum=a[0];
for(i=1;i
运行了这串代码好像不行,没找出错误。。。。希望看到的大佬帮忙找找
局部变量和全局变量及其作用域
变量的作用域:变量在程序中可以被使用的范围。
根据变量的作用域可以将变量分为局部变量和全局变量。
- 局部变量——内部变量
- 定义:在函数内定义,只在本函数内有效
- 说明:main函数中定义的变量旨在main中有效;形参属于局部变量;不同函数中同名变量,占不同内存单元;可在复合语句中定义有效变量。
- 全局变量——外部变量:
- 在函数外部定义的变量。
- 作用域:从定义变量的位置开始到本源文件结束。
动态变量与静态变量
- 函数中的局部变量,如不作专门说明,都属于动态变量
main()
{
int x,y;
...
}
//等价于
main()
{
auto int x,y;
...
}
- 如果要定义静态变量,在变量定义前面加“static”
main()
{
static int x,y;
...
}
动态变量与静态变量的区别
- 内存分配
- 动态变量:调用函数时在动态存储区为其分配存储单元,函数执行结束,所占内存空间即刻释放。
- 静态变量:将其分配在内存的静态存储区中,程序运行结束释放该单元。
- 变量的初值
- 动态变量:如果赋初值则每次函数被调用时执行一次赋值操作。
- 静态变量:若定义时赋初值,则仅在编译时赋初值一次,程序运行后不再给变量赋初值。
注意:动态变量定义变量时若没有赋初值,变量的初值不确定;静态变量若定义时未赋初值,在编译时,系统自动赋初值为0.



