C语言-函数

一、函数的概念
函数是c语言的功能单位,实现一个功能可以封装一个函数来实现。
定义函数的时候一切以功能为目的,根据功能去定函数的参数和返回值。
函数就是讲特定功能的代码封装在一个函数内部,当要使用这些代码时,只需要通过函数名 就可以使用,这样操作起来更加方便
二、函数的分类
1、从定义角度分类(即函数是谁实现的)
1.库函数 (c库实现的)
2.自定义函数 (程序员自己实现的函数)
3.系统调用 (操作系统实现的函数)
2、从参数角度分类
1.有参函数
函数有形参,可以是一个,或者多个,参数的类型随便
完全取决于函数的功能
int fun(int a,float b,double c)
{
}
int max(int x,int y)
{
}
2.无参函数
函数没有参数,在形参列表的位置写个void或什么都不写
int fun(void)
{
}
int fun()
{
}
3、从返回值角度分类
(1).带返回值的函数
在定义函数的时候,必须带着返回值类型,在函数体里,必须有return
如果没有返回值类型,默认返回整型。
1 char fun () // 定义了一个返回字符数据的函数
2 {
3 char b = 'a' ;
4 return b ;
5 }
1 fun ()
2 {
3 return 1 ;
4 }
        
如果把函数的返回值类型省略了,默认返回整型
注:在定义函数的时候,函数的返回值类型,到底是什么类型的,取决于函数的功能。
(2).没返回值的函数
在定义函数的时候,函数名字前面加void
void fun(形参表)
{
      ;
      ;
      return ;
      ;
}
在函数里不需要return
如果想结束函数,返回到被调用的地方,
return ;什么都不返回就可以了
三、函数的定义
1、函数的定义方法
返回值类型 函数名字(形参列表)
{
//函数体,函数的功能在函数体里实现
}
注意:
函数名字是标识符,所以需要满足标识符的命名规则
形参:可以有,也可以没有,也可以有多个,但是即使没有,函数名字后面也必须加括号
函数体上下位置必须有大括号
如果要返回函数执行的结果,也就是返回值,则return后面跟的变量或者值,必须与函数名左边的返回值类型一致
形参必须带类型,而且以逗号分隔
函数的定义不能嵌套,即不能在一个函数体内定义另外一个函数,
所有的函数的定义是平行的。
在一个程序中,相同的函数名只能出现一次
#include <stdio.h>

//定义一个没有参数也没有返回值的函数
void myfun1()
{
    printf("hello world\n");
    printf("nihao beijing\n");
    printf("welcome to 1000phone\n");

    return ;
}

//定义一个有参数的函数
void myfun2(int a, int b)
{
    int sum;
    sum = a + b;

    printf("%d + %d = %d\n", a, b, sum);
}

//定义一个有返回值的函数
int myfun3(int a, int b)
{
    int sum;
    sum = a + b;

    return sum;
}

int main(int argc, char *argv[])
{
    //函数的调用
    //函数在调用的时候如果没有参数,也必须加括号
    //函数调用的时候不能加返回值类型
    myfun1();

    return 0;
}
四、函数的声明
1、概念
对已经定义的函数,进行说明
函数的声明可以声明多次。
2、为什么要声明
有些情况下,如果不对函数进行声明,编译器在编译的时候,可能不认识这个函数,
因为编译器在编译c程序的时候,从上往下编译的。
3、声明的方法
什么时候需要声明
1)主调函数和被调函数在同一个.c文件中的时候
1] 被调函数在上,主调函数在下
1 void fun ( void )
2 {
3 printf ( "hello world\n" );
4 }
5 int main ()
6 {
7 fun ();
8 }
这种情况下 不需要声明
2] 被调函数在下,主调函数在上
1 int main ()
2 {
3 fun ();
4 }
5 void fun ( void )
6 {
7 printf ( "hello world\n" );
8 }
编译器从上往下编译,在main函数(主调函数),不认识fun,需要声明
        
1] 直接声明法(常用)
将被调用的函数的第一行拷贝过去,后面加分号
1 #include < stdio . h >
2
3 // 函数的声明:一般当子函数在主函数的下方时,需要在主函数的上方进行声明
4 void myfun1 ();
5 void myfun2 ( int a , int b );
6 int myfun3 ( int a , int b );
7 int main ( int argc , char * argv [])
8 {
9 myfun1 ();
10 return 0 ;
11 }
12
13 void myfun1 ()
14 {
15 printf ( "hello world\n" );
16 printf ( "nihao beijing\n" );
17 printf ( "welcome to 1000phone\n" );
18
19 return ;
20 }
21
22 void myfun2 ( int a , int b )
23 {
24 int sum ;
25 sum = a + b ;
26
27 printf ( "%d + %d = %d\n" , a , b , sum );
28 }
29
30 int myfun3 ( int a , int b )
31 {
32 int sum ; 33 sum = a + b ;
34
35 return sum ;
36 }
2] 间接声明法
将函数的声明放在头文件中,.c程序包含头文件即可
1 a . c
2 #include”a . h”
3 int main ()
4 {
5 fun ();
6 }
7 void fun ( void )
8 {
9 printf ( "hello world\n" );
10 }
11
12 a . h
13 extern void fun ( void );
2)主调函数和被调函数不在同一个.c文件中的时候
一定要声明
声明的方法:
直接声明法
将被调用的函数的第一行拷贝过去,后面加分号,前面加extern
间接声明法(常用)
将函数的声明放在头文件中,.c程序包含头文件即可
1 myfun . c
2 #include "myfun.h" // 此时包含的头文件要使用双引号,在当前目录下去找对应头文件
3
4 void myfun1 ()
5 {
6 printf ( "hello world\n" );
7 printf ( "nihao beijing\n" );
8 printf ( "welcome to 1000phone\n" );
9
10 return ; 11 }
12
13 myfun . h
14 #ifndef MYFUN_H
15 #define MYFUN_H
16
17 // 函数的声明
18 void myfun1 ();
19
20 #endif // MYFUN_H
21
22 main . c
23 #include < stdio . h >
24 #include "myfun.h"
25
26 int main ( int argc , char * argv [])
27 {
28 myfun1 ();
29
30 return 0 ;
31 }
五、函数的调用
函数的调用方法
变量= 函数名(实参列表);//带返回值的
函数名(实参列表);//不带返回值的
1 #include < stdio . h >
2
3 void myfun1 ();
4 void myfun2 ( int a , int b );
5 int myfun3 ( int a , int b );
6 int main ( int argc , char * argv [])
7 {
8 // 函数的调用
9 // 没有参数也没有返回值
10 // 直接写函数名,并且要在后面加括号
11 myfun1 ();
12
13 printf ( "**********************\n" );
14
15 // 有参数,没有返回值
16 // 需要在函数名右边括号中传入参数,参数可以是常量表达式,也可以是变量表达式
17 myfun2 ( 100 , 90 );
18
19 int x = 10 , y = 20 ;
20 //x y :实参,实际参数,本质就是在函数调用的时候将实参的值传递给形参
21 myfun2 ( x , y );
22
23 printf ( "**********************\n" );
24
25 // 有参数也有返回值
26 // 可以使用一个变量接收函数执行结果(返回值),或者直接输出也可以
27 int n ;
28 n = myfun3 ( 100 , 90 );
29 printf ( "n = %d\n" , n );
30
31 printf ( "sum = %d\n" , myfun3 ( 90 , 66 ));
32
33 return 0 ;
34 }
35
36 void myfun1 ()
37 {
38 printf ( "hello world\n" );
39 printf ( "nihao beijing\n" );
40 printf ( "welcome to 1000phone\n" );
41
42 return ;
43 }
44
45 //a b :形参,形式参数,主要用于保存实参传递的值,本质跟实参没有任何关系,只是值传递
46 void myfun2 ( int a , int b )
47 {
48 int sum ;
49 sum = a + b ;
50
51 printf ( "%d + %d = %d\n" , a , b , sum );
52 }
53 54 int myfun3 ( int a , int b )
55 {
56 int sum ;
57 sum = a + b ;
58
59 return sum ;
60 }
        
六、函数总结
定义函数的时候,关于函数的参数和返回值是什么情况,完全取决于函数的功能。
当编写函数的时候,一开始不要想着函数如何传参和函数的返回值应该是什么,而是当在编写代码的途中,要使用某些值,但是当前函数中不存在,此时就需要进行传参, 这时候考虑怎么传参就是合适的时机 当函数编写完毕后,考虑是否要将某些结果返回给其他函数去使用,此时需要考虑返回值。
使用函数的好处?
1、定义一次,可以多次调用,减少代码的冗余度。
2、使代码,模块化更好,方便调试程序,而且阅读方便