C语言—函数

时间:2024-05-02 19:10:48

一、函数的概念

函数是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 //xy:实参,实际参数,本质就是在函数调用的时候将实参的值传递给形参

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 //ab:形参,形式参数,主要用于保存实参传递的值,本质跟实参没有任何关系,只是

值传递

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