函数定义
在C语言中,把为了实现某一特定的功能的所有语句归纳在一起,就形成了一个函数。比如将两个数进行交换,求两个数中的最大数,将整数转换为字符串,这些功能都可以通过函数来实现。一般来说,函数只实现单一功能。如果一组代码是为了实现一个单一功能,则归纳出来,形成一个函数。
比如求2个数中的最大值的语句如下:
int x;
int y;
int max;
if (x>y) max = x;
else max = y;
那么把这些语句归纳一下,就可以写成下面的函数:
int max(int x, int y)//x,y为形参
{
int max;
if (x>y) max = x;
else max = y;
return max;
}
一般来说,函数的定义形式如下:
返回类型 函数名(参数列表)
{
函数的实现语句;
函数返回语句;
}
上面求最大值的函数中,max是函数名(也代表了函数的首地址),int是函数的返回值类型,而x,y是函数的输入参数。
假如要实现一个两个整数相加的功能,那么可以通过这样一个函数来实现:
int add(int x, int y)
{
int tmp;
tmp = x + y;
return tmp;
}
然后来调用该函数如下:
int main(int argc, char *argv[])
{
int a=7;
int b=15;
int res = max(a,b);
printf(“the max is:%d\n”,res);
}
在main函数中,我们把a,b传给函数max,max将把最大值返回后赋值给变量res。在这里,我们把a,b叫做实参,把max函数定义的时候参数列表中的x,y叫做形参。
当然,一个函数可以没有返回值,也可以没有参数,或者既没有返回值也没有参数。比如:
void function1(int x)
{
printf(“%d\n”,
x);
return;
}
没有返回值。注意,如果没有写void,那么不是没有返回值,而是默认返回整型值。
void function2(void)
{
printf(“hello world!\n”);
}
函数的参数和返回值是一个需要值得注意的地方。函数的参数,既有输入参数,也有输出参数,而有的参数既做输入又做输出。比如:
int itoa(int a, char buff[], int len);
定义这么一个函数,int a, int len是输入参数,而char buff是输出参数,用来存储a转化为字符串之后的值。而int返回值,可以用来标记这个转换是否成功,以及失败之后的原因。
函数定义和实现了之后,可以提供给调用者调用。在调用函数的时候,传给函数的数据叫实参,而函数列表里的参数可以叫形参。实参的类型一定要和函数定义中的类型一致,否则会出问题。调用者叫caller,被调用者叫callee。
比如,在main函数里调用上面的add函数,那么就像下面来实现:
int main(void)
{
int a = 10;//a,b成为实参
int b = 5;
int c = add(a,b);//把a和b相加,用c来存储a+b的返回值。
add(a+5, b-1);//把a+5和b-1相加,不保存返回值。
add(1,2);//把1和2相加,不保存返回值
return 0;
}
可见,传给函数add的参数,既可以是变量,也可以是表达式,还可以是常量。但前提是实参的类型必须和函数的定义类型是一致的,即在这里都应该是整型。
回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
⑴定义一个回调函数;
⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;
⑶当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。