C语言-函数
无参函数
- 无参函数的定义形式
类型标识符 函数名()
{声明部分
语句
}
其中,类型标识符合函数名称为函数头。类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型。函数名是由用户定义的标识符,函数名后有一个括号(),其中无参数,但是括号不可少。
{}中的内容称为函数体。在函数体中声明部分,是对函数体内部所用到的变量的类型说明。在很多情况下都不要求无参函数有返回值,此时函数类型符可以写为void。例如:
void Hello(){
printf("Hello, world\n);
}
这里只把main改为Hello作为函数名,其余不变。Hello函数是一个无参函数,当被其他函数调用时,输出Hello, world字符串。
有参函数
- 有参函数定义的形式
类型标识符 函数名(形式参数表列)
{
声明部分
语句
}
有参函数比无参函数多了形式参数表列。在形参表中给出的参数称为形式参数。他们可以是各种类型的变量,各参数之间用,隔开。在进行函数调用时,
主调函数将赋予这些形式参数实际的值。形参既然是变量,必须在形参表中给出形参的类型说明。例如:
int max(int a, int b){
if (a>b) return a;
else return b;
}
第一行说明max函数是一个整型函数,其返回的函数值是一个整数。形参为a,b均为整型量。a,b的具体值是由主调函数在调用时传送过来的。在{}中的函数体内,除形参外,没有其他变量,因此只有语句没有声明部分。
在max函数体中的return语句是把a(或者b)的值作为函数的值返回给主调函数。有返回值函数中至少有一个return语句。注意在C程序中,一个函数的定义可以放在任意位置,既可以放在主函数main之前,也可以放在main之后。
#include<stdio.h>
//自定义函数
int max(int a, int b){
if (a>b) return a;
else return b;
}
int main(){
int max(int a, int b); // 先声明后使用,符合c语言先定义后使用的规范
int x,y,z;
printf("input two numbers:\n");
scanf("%d%d",&x,&y);
z = max(x,y);
printf("max number = %d\n",z);
}
结果显示:

函数的参数和函数的值
- 形式参数和实际参数
函数的参数主要分为形参和实参。形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。形参和实参的功能是做数据传送。
发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。函数的形参和实参具有以下特点:- 形参变量只有在被调用时才分配内存单元,在调用结束时,即可释放所分配的内存单元。因此形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。
- 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。
- 实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配的错误
- 函数调用中发生的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
实例:实现计算\(\sum n_{i}\)
#include<stdio.h>
//函数调用
int 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);//打印结果
}
结果输出:

- 函数的返回值
函数的值是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。如调用正弦函数取得正弦值,,对函数的返回值有几点说明- 函数的值只能通过return语句返回主调函数
return语句的一般形式:return 表达式;
或return (表达式); - 函数值的类型和函数定义中函数的类型应保持一致。如果两者不一致,则以函数类型为准,自动进行类型转换。
- 如函数值为整型,在函数定义时可以省去类型说明
- 不返回函数值的函数,可以明确定义为“空类型”,类型说明符为
void
- 函数的值只能通过return语句返回主调函数