【C语言】函数---从入门到精通

简介: 【C语言】函数---从入门到精通

函数


函数是什么?


函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。


您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。


函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。


C 标准库提供了大量的程序可以调用的内置函数。例如,函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存到另一个位置。


函数还有很多叫法,比如方法、子例程或程序,等等。


库函数


C语言库函数是把自定义函数放到库里,是别人把一些常用到的函数编完放到一个文件里,供程序员使用。程序员用的时候把它所在的文件名用#include<>加到里面就可以了(尖括号内填写文件名),例如#include。


自定义函数


定义函数

在 C 语言中,函数由一个函数头和一个函数主体组成。函数的所有组成部分:


返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。

函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。

参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。

函数主体:函数主体包含一组定义函数执行任务的语句


1.函数的参数


实际参数(实参)

真实传递给函数的参数,可以是常量,变量,表达式,函数等,无论是何种形式,在进行函数调用时都必须有确定的值

以便把这些值传给形参

形式参数(形参)-形式上的参数-

形式参数指函数名后括号中的变量,形参只有在函数被调用的过程才会被实例化,当函数调用完后会自动销毁,形参只有在函数中有效

当实参传给形参的时候,形参其实是实参的一份临时拷贝,对形参的修改,实参不会改变


2.函数调用:


传值调用

函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参

传址调用

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

例: swap(&a,&b);

指针接收 void swap(int*pa ,int * pb)


3.函数的嵌套调用和链式访问


嵌套调用:函数和函数之间可以有机的结合起来

链式访问: 把一个函数的返回值作为另一个函数的参数


4.函数的声明和定义


函数声明:

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

2.函数的声明一般出现在函数的使用之前,要满足先声明在调用

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

函数定义:

函数的定义是指函数的具体实现,交代函数的功能实现

例:


//函数声明
Add(int, int);
int main()
{
  int a = 10;
  int b = 20;
  //函数调用
  int ret = Add(a, b);
  printf("%d/n", ret);
  return 0;
}
//函数定义
int Add(int x, int y)
{
  int z = x + y;
  return z;
}


分模块书写

头文件add.h:


//头文件里面放函数声明
#ifndef __ADD_H__//if not define  如果没有定义过,防止同一个头文件被引用多次
#define __ADD_H__
//函数的声明
#endif
源add.c:
#define _CRT_SECURE_NO_WARNINGS 1
int Add(int x, int y)
{
  return x + y;
}
源test.c:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"Add.h"//区别""和<>
int main()
{
  int a = 10;
  int b = 20;
  int sum = Add(a, b);
  printf("%d\n", sum);
  return 0;
}


函数递归


什么是递归?


递归指的是在函数的定义中使用函数自身的方法。



C 语言支持递归,即一个函数可以调用其自身。但在使用递归时,程序员需要注意定义一个从函数退出的条件,否则会进入死循环。


递归的两个必要条件:


存在限制条件,当满足这一限制条件的时候,递归将不再继续

每次递归调用之后越来越接近这个限制条件

最简单的递归:


#include<stdio.h>
int main()
{
   main();
   return 0;
递归求数的阶乘:
#include <stdio.h>
double factorial(unsigned int i)
{
   if(i <= 1)
   {
      return 1;
   }
   return i * factorial(i - 1);
}
int  main()
{
    int i = 15;
    printf("%d 的阶乘为 %f\n", i, factorial(i));
    return 0;
}
目录
相关文章
|
9天前
|
程序员 C语言
C语言库函数 — 内存函数(含模拟实现内存函数)
C语言库函数 — 内存函数(含模拟实现内存函数)
18 0
|
20天前
|
编译器 C语言 C++
【C语言】memset()函数(内存块初始化函数)
【C语言】memset()函数(内存块初始化函数)
23 0
|
9天前
|
程序员 C语言 开发者
C语言库函数 — 字符串函数(含模拟实现字符串函数)
C语言库函数 — 字符串函数(含模拟实现字符串函数)
35 0
|
16天前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现1
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
16天前
|
机器学习/深度学习 C语言
【C语言】函数的系统化精讲(三)1
【C语言】函数的系统化精讲(三)
|
16天前
|
编译器 C语言
【C语言】函数的系统化精讲(一)2
【C语言】函数的系统化精讲(一)2
|
16天前
|
编译器 Serverless C语言
【C语言】函数的系统化精讲(一)1
【C语言】函数的系统化精讲(一)
|
16天前
|
存储 程序员 编译器
【C语言第二回】main、printf和库函数
【C语言第二回】main、printf和库函数
|
20天前
|
编译器 C语言 C++
【C语言】calloc()函数详解(动态内存开辟函数)
【C语言】calloc()函数详解(动态内存开辟函数)
24 0
|
20天前
|
存储 前端开发 编译器
【C语言】memmove()函数(拷贝重叠内存块函数详解)
【C语言】memmove()函数(拷贝重叠内存块函数详解)
32 1