前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言进阶指南(2)(库函数与自定义函数)

C语言进阶指南(2)(库函数与自定义函数)

原创
作者头像
代码小豪
发布2024-06-05 13:18:05
1220
发布2024-06-05 13:18:05
举报
文章被收录于专栏:C语言程序指南

*欢迎来到博主的专栏:C语言进阶指南

博主的id:reverie_ly*

一、函数

以数学概念中的函数为例,我们知道数学中函数时输入自变量的参数就能得到函数的值。如函数y=kx+b,若我们为输入1,则函数的结果是k+b。

C语言中的函数也是如此,当我们使用函数时,需要确定使用的函数名,以及函数的参数。而后函数会根据参数进行操作。以printf()函数为例,printf(“hello,world”)中,printf是我们需要调用的函数名,”hello,world”是我们输入的参数,printf函数根据参数执行效果。

函数的另一个翻译称为:子程序。这是因为任何的语句都能构成一个函数,C语言中的函数就是执行某一个任务的一小段代码。在实际编程中,我们也经常将某段经常使用的程序包装成函数来使用。

二、 库函数

C语言标准规定了一些库函数,这些库函数具有完成某个特定任务的作用,编译器的产商根据这些标准来实现库函数的功能。这些库函数都是由巨佬实现的功能,所以大家可以放心使用哦

我们常见的printf(),scanf()就是库函数,当我们使用库函数时,我们需要引用相应的头文件,

以printf()函数为例,我们需要引用<stdio.h>

strlen()函数为例,我们则需要引用<string.h>

C语言中的库函数是非常多,我们可以使用工具来学习库函数,可以去www.cplusplus.com网站了解。或者使用msdn软件索引,最好的方法还是关注博主的专栏哦 ^ _^。

MSDN软件。(博主忘了哪里下的了,以后研究一下怎么放在百度网盘,还请关注博主哦~)。

三、自定义函数

三(1)、自定义函数的概念

自定义函数一般写在主函数上方,形式为:

ret-function(定义函数形式) fun-name(parameter_list)

{ function body;}

在调用函数时,将fun-name(参数)用于主函数内即可。

函数得到返回值时,或者函数运行结束时,回到主函数。

参数的分类

1)实参(argument)——实际参数,实际参数是调用函数时传递给函数的参数的值。可以使用常量,变量,表达式,函数等。实参需要有具体的值,以便把值传给形参。

2)形参(parameter)——形式参数。形式参数是定义函数时用到的参数的变量,用于定义函数名和函数体时用到的变量。调用函数时,实参的数据类型,数值会传输给形参进行运算。

嵌套调用

在函数的调用过程中调用另一个函数称为嵌套调用

链式访问

将一个函数的返回值用作另一个函数的参数

三(2)、自定函数的声明

函数的声明、定义和调用

函数的声明:将一个函数的类型,名称,参数类型写在头文件上,告知编译器存在一个·函数,不用写具体实现。

三(3)、自定函数的定义

函数的定义:将函数的具体实现写在源文件上,需要写出函数名,函数类型;以及返回值和具体实现的程序

(注意这两个函数所在的文件是不同的,通常情况下,函数的声明在(.h)文件中,函数的定义在(.c)文件中,当我们做好这两步后,就可以在程序中使用自定义函数了)。

三(4)函数的调用

分为传值调用传址调用

传值调用:当实参传输数据给形参时,其原理为将实参的值临时拷贝用于形参进行运算执行。因形参和实参占用不同的内存块。当函数调用结束后,形参的值不会改变实参。若要编写一个能让形参改变实参的函数,则运用传址调用。

传址调用:将函数外部的变量参数以地址的方式传给函数。在运算过程中将修改的结果保存在地址中,因此在结束函数调用后,会改变函数外部参数变量的值

三(5)函数的递归调用

在程序的实现过程中,为了实现某个功能可能会多相同步骤的函数调用。递归调用即在函数中调用该函数本身,目的是为了简化步骤。

如求出一个数的最高位数

若不使用递归调用的情况下,我们需要将一个整数频繁的除以10.我们可以将相同除10的步骤编写成一个函数,使用函数递归的方式简化程序(此实现方式也可以用循环)

代码语言:c
复制
#include<stdio.h>
void s(int *x)
{
      if(*x>10)
      {
          *x=*x/10;
          s(x);//可以发现我们又调用了一次s函数
      }
}
int main()//这段代码是为了实现求一个正数的最高数位的值、。
{
      unsigned int num=0;
      scanf("%d",&num);
      s(&num);
      printf("%d",num);
}

因递归调用导致的栈溢出

栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清除变量的存储区。里面的变量通常是局部变量函数参数等。

.函数调用层次太深。函数递归调用时,系统要在栈中不断保存函数调用时的现场和产生的变量,如果递归调用太深,就会造成栈溢出,这时递归无法返回。再有,当函数调用层次过深时也可能导致栈无法容纳这些调用的返回地址而造成栈溢出。

避免栈溢出的方法

**在函数的调用递归的过程中设定递归的停止条件。

在调用的过程中值与停止条件越来越近。**

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、函数
  • 二、 库函数
  • 三、自定义函数
    • 三(1)、自定义函数的概念
      • 三(2)、自定函数的声明
        • 三(3)、自定函数的定义
          • 三(4)函数的调用
            • 三(5)函数的递归调用
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档