首页 > C > 函数 阅读:57,774

函数定义

C语言中,把为了实现某一特定的功能的所有语句归纳在一起,就形成了一个函数。比如将两个数进行交换,求两个数中的最大数,将整数转换为字符串,这些功能都可以通过函数来实现。一般来说,函数只实现单一功能。如果一组代码是为了实现一个单一功能,则归纳出来,形成一个函数。

比如求2个数中的最大值的语句如下:

int x;

int y;

int max;

if (x>y) max = x;

else max = y;

 

那么把这些语句归纳一下,就可以写成下面的函数:

int max(int x, int y)//xy为形参

{

         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);//ab相加,用c来存储a+b的返回值。

         add(a+5, b-1);//a+5b-1相加,不保存返回值。

         add(1,2);//12相加,不保存返回值

         return 0;

}

可见,传给函数add的参数,既可以是变量,也可以是表达式,还可以是常量。但前提是实参的类型必须和函数的定义类型是一致的,即在这里都应该是整型。

 

回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

⑴定义一个回调函数;

⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;

⑶当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。

周哥教IT,分享编程知识,提高编程技能,程序员的充电站。跟着周哥一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

当你决定关注「周哥教IT」,你已然超越了90%的程序员!

IT黄埔-周哥教IT技术交流QQ群:213774841,期待您的加入!

二维码
微信扫描二维码关注