一文搞定C语言函数和函数递归(和bug郭一起学C系列)(1)

简介: 一文搞定C语言函数和函数递归(和bug郭一起学C系列)(1)

函数的概念

什么是函数呢?

是和数学里学的函数一样吗?


数学里的函数,具有对应关系和某种功能!


你了解C语言函数吗?维基百科中,C语言函数又叫做:子程序!


在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method,

subprogram, callable unit),是一个大型程序中的某部分代码, 由一个或多个语句块组

成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性。

一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软

件库。

函数在面向过程的语言中已经出现。是结构(Struct)和类(Class)的前身。本身就是对具有相关性语句的归类和对某过程的抽象。

让我们来看看我们最熟悉的主函数!


int main()
    {
       //里面多条语句块组成!
       //具有独立性!
    }

还有函数的其他特性,我们学完这一章节再来总结一下!


C语言函数的分类


库函数

库函数就是我们直接可以使用的函数,像printf,scanf,strlen ....等等,C语言函数库里已经实现好了,且具有某些功能的函数!我们直接拿来用就好了,但是前提我们得引该函数所在函数库的头文件,也就是我们之前比喻的:用别人的东西,我们要打招呼!我们包含一下这个头文件就可以使用该函数了!

 

#include<stdio.h>
    int main()
    {
     printf("hhh");
     //该函数的使用要引头文件<stdio.h>
    }

自定义函数

自定义函数,顾名思义就是自己定义函数!

当我们要实现某种功能时,函数库中没有相应函数能够具有这种功能,那我们只能自己写一个具有该功能的函数了。

int Add(int a,int b)
{
  return a+b;
}
  int main()
  {
      int a=1,b=3;
      int c=Add();  //自定义加法功能的函数!
  }

该函数的细节,我们稍后学习,我们只要知道,这就是自定义函数就OK!


库函数

为什么会有库函数?


我们知道在我们学习C语言编程的时候,总是在一个代码编写完成之后迫不及待的想知道结果,想把这个结果打印到我们的屏幕上看看。这个时候我们会频繁的使用一个功能:将信息按照一定的格式打印到屏幕(printf)。

#include<stdio.h>
int main()
{
 printf("搞定C语言函数和函数递归");
 return 0;
}

在编程的过程中我们会频繁的做一些字符串的拷贝工作(strcpy)。

#include<string.h>
    int main()
    {
     char arr1[]="abcdefg";
     char arr2[]="xxx";
     strcpy(arr1,arr2);
     //将arr2拷贝到arr1中!
    }

在编程是我们也计算,总是会计算n的k次方这样的运算(pow)。

#include<math.h> 
int main()
{ 
   int n=2;
   int k=3;
   int x=pow(n,k);
   //计算n的k次方!
  return 0;
}

像上面我们描述的基础功能,它们不是业务性的代码。我们在开发的过程中每个程序员都可能用的到,为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。

不同函数可能写在不同的函数库中,我们需要引用不同的函数库!

那我们该怎么学习库函数呢?

这里我给大家推荐一个学习和查阅函数库的网站:www.cplusplus.com建议收藏!


让我们一起来看看吧!

image.png

C library就是C语言函数库!

image.png

注:C语言函数库,如果要在C++代码中引用,就将函数库名加个C

这就是函数库的目录!点击就可以打开该函数库进行该函数库中函数学习和查阅!

image.png

也可以点击搜索,输入函数名,查阅学习!


简单的总结,C语言常用的库函数都有:


IO函数

字符串操作函数

字符操作函数

内存操作函数

时间/日期函数

数学函数

其他库函数

我们参照网站文档,学习几个库函数


memset

image.png



我们学习一个函数,首先我们应该知道,该函数的作用

Fill block of memory

Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char).

这就是memseth函数的作用,将ptr指针地址的空间,num个字节,初始化为value值!


然后我们在看看f返回值,每个参数的细节,还有所在库函数!

void * memset ( void * ptr, int value, size_t num ); <string.h>

可以知道该函数的返回值是void(空)。

ptr是一个void类型的指针。

value是int 类型的值,

num是字节个数。

还有一些相关细节描述,就可以参考文档学了。

我们就可以使用该函数了!

image.png

库函数的学习就介绍到这里,可以利用网站文档自行学习!http://www.cplusplus.com/


自定义函数

如果库函数能干所有的事情,那还要程序员干什么?

所有更加重要的是自定义函数。

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

函数的组成:


ret_type fun_name(para1, * )
{
    statement;//语句项
}
ret_type //返回类型
fun_name// 函数名
para1    //函数参数

我们举个例子,大家就懂了怎么自定义函数了!


写一个函数求两个数中的较小值!


int Min(int x,int y)   //函数的定义
 {
    if(x<y)
    return x;
    else
    return y;
 }
int main()
{
   int x=2;
   int y=5;
  int c = Min(x,y); //函数的调用
  return 0;
}

在Min调用函数中,函数的参数是x,y叫做实际参数,我们将x,y传给函数,然后,函数就会接收,创建了int x,int y来接收实际参数,(int x,int y)是形式参数!是x,y的临时拷贝!而int c= Min(x,y);就是将函数返回值,我们要求的最小值接收。而且类型要一致!


我们再来写个函数!


交换两数


void Exchange1(int a,int b) //函数的定义
{
    int c=0;
    c=a;
    a=b;
    b=c;
}
 int main()
 {
   int a=2;
   int b=3;
   printf("a=%d b=%d\n",a,b);
   Exchange1(a,b);//函数的调用
   printf("a=%d b=%d",a,b);
 }

image.png

我们看运行结果,并没有实现两数的交换为啥会这样呢?你可以调试一下!

我们再用另一种方式写这个代码!


void Exchange2(int* a,int* b) //函数的定义
{
    int c = 0;
    c = *a;
   *a = *b;
   *b = c;
}
 int main()
 {
   int a=2;
   int b=3;
   printf("a=%d b=%d\n",a,b);
   Exchange2(&a,&b);//函数的调用
   printf("a=%d b=%d",a,b);
 }

image.png

为啥将实际参数a,b改成&a,&b指针就能实现两数的交换!

我们学习函数的参数就知道了!

目录
相关文章
|
17天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
2天前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
11 2
|
6天前
|
C语言
【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
7 0
|
11天前
|
缓存 安全 编译器
【C 言专栏】C 语言函数的高效编程技巧
【5月更文挑战第1天】本文探讨了C语言中函数的高效编程技巧,包括函数的定义与作用(如代码复用和提高可读性)、设计原则(单一职责和接口简洁)、参数传递方式(值传递、指针传递和引用传递)、返回值管理、调用约定、嵌套与递归调用,以及函数优化技巧和常见错误避免。掌握这些技巧能提升C语言代码的质量和效率。
【C 言专栏】C 语言函数的高效编程技巧
|
13天前
|
C语言
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
|
13天前
|
C语言
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
|
13天前
|
C语言
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
|
15天前
|
安全 C语言
【C语言】strcpy与strncpy函数的使用和模拟实现
【C语言】strcpy与strncpy函数的使用和模拟实现
5 0
|
15天前
|
C语言
【C语言】字符分类函数与字符转换函数
【C语言】字符分类函数与字符转换函数
10 1
|
15天前
|
程序员 编译器 C语言
C语言之函数与参数
C语言之函数与参数
7 0