当前位置:   article > 正文

C语言的函数详解_c语言里面的函数怎么理解

c语言里面的函数怎么理解

目录

一、函数介绍

二、库函数

三、自定义函数

四、函数的参数和调用

五、函数的嵌套调用和链式访问

六、函数的声明和定义

七、函数递归

八、总结

一、函数介绍

C 语言中的函数是一段可以重复使用的代码,用来独立地完成某个功能,它可以接收用户传递的参数,也可以不接收;将代码段封装成函数的过程叫作函数定义

二、库函数

1.定义

    为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。

    C语言中把常用的功能进行了封装,封装成一个个函数,提供出来供大家使用。
    C语言并不去直接实现库函数,而是提供了C语言的标准和库函数的约定——约定函数的功能、名字、参数、返回值等。而库函数的实现一般由编译器去实现——vs2022、gcc等去实现。
2.常用的库函数
1.IO函数——输入/输出函数:printf、scanf、getchar、putchar
2.字符串操作函数——strlen、strcmp
3.字符操作函数——islower、isupper
4.内存操作函数——memset、memcmp
5.时间/日期函数——time
5.数学函数——sqrt、pow
6.其他库函数
tips
1.库函数必须要包含#include对应的头文件。
2.可用www.cplusplus.com   
          http://en.cppreference.com
   这些网站去查询学习库函数。

三、自定义函数

1.定义

   自定义函数和库函数一样,有函数名,返回值类型和函数参数。 但是不一样的是这些都是我们自己来设计,这给程序员一个很大的发挥空间。

2.语法结构

  1. ret_type fun_name(para1, * )
  2. {
  3. statement;//语句项
  4. }
  5. ret_type 返回类型
  6. fun_name 函数名
  7. para1    函数参数

函数的返回类型取决于程序员的需求,可返回空类型(void)、整型类型(int)等等。

例:我们可以写一个函数来找出两个整数的最大值

  1. int get_max(int a, int b)//需要返回最大值,是整数,所以返回类型是int
  2. {
  3. return(a > b) ? a : b;
  4. }
  5. int main()
  6. {
  7. int a = 1120;
  8. int b = 200;
  9. int max=get_max(a, b);
  10. printf("最大值是:%d", max);
  11. return 0;
  12. }

四、函数的参数和调用

1.实际参数(实参)

真实传给函数的参数,叫实参。

实参可以是:常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形
参。

2.形式参数(形参)

形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内

存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数
中有效。如三中例子中的函数get_max中的参数就为形参。
3.理解
当实参传递给形参的时候,形参是实参的一份临时拷贝,所以形参的修改并不会影响实参,形参在函数调用完成后就会自动销毁。
4.传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
我们可以举一个例子进行理解:我们写一个函数来交换两个整型变量
  1. void swap(int x, int y)
  2. {
  3. int a = 0;//创建一个整型变量a
  4. a = x; //将x的值赋给a
  5. x = y; //将y的值赋给x
  6. y = a; //将a的值(里面是一开始x的值)赋给y实现交换
  7. }
  8. int main()
  9. {
  10. int a = 10;
  11. int b = 20;
  12. swap(a, b);
  13. printf("交换后:a=%d,b=%d", a, b);
  14. return 0;
  15. }

我们希望交换a、b两值,可以成功吗?我们看运行结果发现是不行的。

运行结构如下:

 这是为什么?因为形参并不能改变实参,所以我们在函数内交换的是形参,并不能传给实参,导致了错误,那怎么改正呢?我们需要使用传址调用。 

5.传址调用

传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。

这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操
作函数外部的变量。
简而言之,传址调用可以通过调用地址起到利用函数改变实参的作用,这里我们也举一个同样的例子:写一个函数利用传址调用来交换两个整数:
  1. void swap(int *x, int *y)//传址调用,取实参a、b的地址赋给形参x、y
  2. {
  3. int n = 0;
  4. n = *x;//将x的地址给n
  5. *x = *y;//将y的地址给x
  6. *y = n;//将n的值给y的地址
  7. } //这里将形参改变的地址给了实参,起到了改变实参值的作用
  8. int main()
  9. {
  10. int a = 10;
  11. int b = 20;
  12. swap(&a, &b);
  13. printf("交换后:a=%d,b=%d", a, b);
  14. return 0;
  15. }

这里我们再查看运行结果,发现就可以如愿以偿的交换两个整数啦!

运行结果如下:

 

五、函数的嵌套调用和链式访问

函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。
1.嵌套调用
   函数内可以嵌套另一个函数,但是不能嵌套定义另一个函数。
   例:
  1. void hello2()
  2. {
  3. printf("hehe\n");
  4. }
  5. void hello1()
  6. {
  7. printf("haha\n");
  8. hello2();
  9. }
  10. int main()
  11. {
  12. hello1();
  13. return 0;
  14. }

这里我们就在函数hello1内嵌套调用了函数hello2,运行结果如下:

 

2.链式访问

把一个函数的返回值作为另一个函数的参数。

我们可以举一个经典例子:

  1. int main()
  2. {
  3. printf("%d",printf("%d",printf("%d",43)));
  4. return 0;
  5. }

这里的运行结果是4321,这里就使用了链式访问,最右边的printf函数打印的是43,它的返回值43为中间printf函数的参数,所以中间printf函数打印2,它的返回值2为最左边printf函数的参数,所以最左边printf函数打印1  最终,其运行结果就为4321

六、函数的声明和定义

1.函数声明

I. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数

声明决定不了。

II. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。

III.函数的声明一般要放在头文件中。

2.函数定义

函数的定义是指函数的具体实现,交待函数的功能实现。
七、函数递归
1.介绍
 I.函数自己调用自己称为递归。
 II. 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大减少了程序的代码      量。
2.必要条件
I.存在限制条件,当满足这个限制条件的时候,递归便不再继续。
II.每次递归调用之后越来越接近这个限制条件。
3.我们可以进行相关练习来加深理解
 接受一个整型值,按照顺序打印它的每一位
  1. void print(int n)
  2. {
  3. if (n > 9)
  4. {
  5. print(n / 10);
  6. }
  7. printf("%d ", n % 10);
  8. }
  9. int main()
  10. {
  11. int num = 1234;
  12. print(num);
  13. return 0;
  14. }

我们利用递归,调用函数print,当整型值大于9时,便利用n/10去掉它最左边的位数,并且利用print函数进行下一层,随后再用n%10得到最后一位并进行打印。运行结果如下:

 

八、总结

    通过本次内容学习,我们学习了关于函数的相关知识,包括:库函数、自定义函数、函数的参数和调用、函数的嵌套调用和链式访问、函数的声明和定义、函数的递归。希望大家可以熟练掌握并运用!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/624038
推荐阅读
相关标签
  

闽ICP备14008679号