一、函数的概念
函数是C语言的基本功能单位,实现一个功能可以通过封装一个函数来实现;
封装函数一切以函数的功能为主,根据功能来设置参数和返回值;
函数就是讲特定功能的代码封装在一个函数内部,当要使用这些代码时,只需要通过函数名就可以使用,这样操作起来更加方便
二、函数的分类
2.1定义的角度
1.库函数(c库实现);
2.系统调用(操作系统实现的函数);
3.自定义函数(程序员自定义);
2.2有无参数
1.有参函数
函数有形参,可以是一个,或者多个,参数的类型随便完全取决于函数的功能
int fun(int a,float b,double c)
{
}
int max(int x,int y)
{
}
2.无参函数
函数没有参数,在形参列表的位置写个void或什么都不写
int fun(void)
{
}
int fun()
{
}
2.3、从返回值角度分类
(1).带返回值的函数
在定义函数的时候,必须带着返回值类型,在函数体里,必须有return
如果没有返回值类型,默认返回整型。
例1:
1 char fun()//定义了一个返回字符数据的函数
2 {
3 char b='a';
4 return b;
5 }
例2:
1 fun()
2 {
3 return 1;4 }
如果把函数的返回值类型省略了,默认返回整型
注:在定义函数的时候,函数的返回值类型,到底是什么类型的,取决于函数的功能。
(2).没返回值的函数
在定义函数的时候,函数名字前面加void
void fun(形参表)
{
;
;
return ;
;
}
在函数里不需要return
如果想结束函数,返回到被调用的地方, return ;什么都不返回就可以了
例3:
1 #include <stdio.h>
2 int max(int x,int y)
3 {
4 int z;
5 if(x>y)
6 z=x;
7 else
8 z=y;
9 return z;
10 }
11 void help(void)
12 {
13 printf("*********************\n");
14 printf("********帮助信息*****\n");
15 printf("*********************\n");
16 }
17 int main(int argc, char *argv[])
18 {
19 int num;
20 help();
21 num = max(10,10+5);
22 printf("num=%d\n",num);
23 return 0;24
}
3. 函数的定义
3.1、函数的定义方法
返回值类型 函数名字(形参列表)
{
//函数体,函数的功能在函数体里实现
}
注意:
函数名字是标识符,所以需要满足标识符的命名规则
形参:可以有,也可以没有,也可以有多个,但是即使没有,函数名字后面也必须 加括号
函数体上下位置必须有大括号
如果要返回函数执行的结果,也就是返回值,则return后面跟的变量或者值,必须与函数名左边的返回值类型一致
形参必须带类型,而且以逗号分隔
函数的定义不能嵌套,即不能在一个函数体内定义另外一个函数,
所有的函数的定义是平行的。
在一个程序中,相同的函数名只能出现一次
1 //定义一个没有参数也没有返回值的函数
2 void myfun1()
3 {
4 printf("hello world\n");
5 printf("nihao beijing\n");
6 printf("welcome to 1000phone\n");
7
8 return ;
9 }
10
11 //定义一个有参数的函数
12 void myfun2(int a, int b)
13 {
14 int sum;
15 sum = a + b;
16
17 printf("%d + %d = %d\n", a, b, sum);18 }
19
20 //定义一个有返回值的函数
21 int myfun3(int a, int b)
22 {
23 int sum;
24 sum = a + b;
25
26 return sum;
27 }
4. 函数的声明
4.1、概念
对已经定义的函数,进行说明
函数的声明可以声明多次。
4.2、为什么要声明
有些情况下,如果不对函数进行声明,编译器在编译的时候,可能不认识这个函数,因为编译器在编译c程序的时候,从上往下编译的。
4.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 }
5. 函数的调用
函数的调用方法
变量= 函数名(实参列表);//带返回值的
函数名(实参列表);//不带返回值的
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 }
5354 int myfun3(int a, int b)
55 {
56 int sum;
57 sum = a + b;
58
59 return sum;
60 }
6. 函数总结
定义函数的时候,关于函数的参数和返回值是什么情况,完全取决于函数的功能。
当编写函数的时候,一开始不要想着函数如何传参和函数的返回值应该是什么 而是当在编写代码的途中,要使用某些值,但是当前函数中不存在,此时就需要进行传参,这时候考虑怎么传参就是合适的时机 当函数编写完毕后,考虑是否要将某些结果返回给其他函数去使用,此时需要考虑返回值 使用函数的好处?
1、定义一次,可以多次调用,减少代码的冗余度。
2、使咱们代码,模块化更好,方便调试程序,而且阅读方便