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、使代码,模块化更好,方便调试程序,而且阅读方便