前言
各位小伙伴大家好!上期小编给大家讲解了C语言中的数组,接下来讲讲C语言中的函数!
1. 函数的概念和分类
【概念】本质上就是子程序。
【分类】
库函数:C语言内部提供的函数。
自定义函数:自己写出的函数。
2.库函数
【概念】库函数(Library function)是将函数封装入库,供用户使用的一种方式。
【常见库函数】
- IO函数
- 字符串操作函数
- 内存操作函数
- 时间/日期函数
- 数学函数
【简单示例】
#include <stdio.h>
#include <math.h>
int main()
{
double d = 16.0;
double r = sqrt(d);
printf("%lf\n", r);
return 0;
}
3. 自定义函数
3.1 自定义函数的简单介绍
自定义函数就是自己定义的函数,功能可以多种多样!
ret_type fun_name(形式参数)
{
}
• ret_type 是函数返回类型
• fun_name 是函数名
• 括号中放的是形式参数
• {}括起来的是函数体
可以把函数想象成⼩型的⼀个加⼯⼚,⼯⼚得输⼊原材料,经过⼯⼚加⼯才能⽣产出产品,那函数也是⼀样的,函数⼀般会输⼊⼀些值(可以是0个,也可以是多个),经过函数内的计算,得出结果。
3.2 自定义函数举例
写⼀个加法函数,完成2个整型变量的加法操作
#include <stdio.h>
int Add(int x, int y)
{
int z = 0;
z = x+y;
return z;
}
int main()
{
int a = 0;
int b = 0;
//输⼊
scanf("%d %d", &a, &b);
//调⽤加法函数,完成a和b的相加
//求和的结果放在r中
int r = Add(a, b);
//输出
printf("%d\n", r);
return 0;
}
4. 形参和实参
4.1 形参
【概念】写在自定义函数内部的参数。
【形参的实例化】形式参数只有在函数被调⽤的过程中为了存放实参传递过来的值,才向内存申请空间。
4.2 实参
【概念】真实传递给函数的参数。
4.3 形参和实参的关系
4.3.1 理解
- 形参和实参各⾃是独⽴的内存空间。
- 形参是实参的⼀份临时拷⻉。
4.3.2 举例代码和调试
#include <stdio.h>
int Add(int x, int y)
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int a = 0;
int b = 0;
//输⼊
scanf("%d %d", &a, &b);
//调⽤加法函数,完成a和b的相加
//求和的结果放在r中
int r = Add(a, b);
//输出
printf("%d\n", r);
return 0;
}
5. 嵌套函数和链式访问
5.1 嵌套函数
【说明】在函数中调用函数,就是嵌套函数。函数可以嵌套,但是函数不可以嵌套定义。
#include <stdio.h>
void test(int arr[],sz); //函数的声明
void print(int arr[],int sz);
int main()
{
int arr[10] = {0};
int sz = sizeof(arr)/sizeof(arr[0]);
test(arr,sz); //函数的调用——打印数组各元素
return 0
}
void test(int arr[],sz) //函数的调用
{
int i =0;
for(i=0;i<sz;i++)
{
arr[i]=i; //数组元素赋值
}
print(arr,sz);
}
void print(int arr[],int sz)
{
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]); //打印数组元素
}
}
5.2 链式访问
【说明】将⼀个函数的返回值作为另外⼀个函数的参数,像链条⼀样将函数串起来。
【示例】
#include <stdio.h>
int main()
{
printf("%d\n", strlen("abcdef"));//链式访问
return 0;
}
6. 函数的声明和定义
6.1 单个文件
【单个文件举例】
//判断⼀年是不是闰年
#include <stido.h>
int is_leap_year(int y)
{
if(((y%4==0)&&(y%100!=0)) || (y%400==0))
return 1;
else
return 0;
}
int main()
{
int y = 0;
scanf("%d",&y);
int r = is_leap_year(y);
if(r == 1)
printf("闰年\n");
else
printf("⾮闰年\n");
return 0;
}
6.2 多个文件
我们写代码时候,代码可能⽐较多,不会将所有的代码都放在⼀个⽂件中;我们往往会根据程序的功能,将代码拆分放在多个⽂件中。
⼀般情况下,函数的声明、类型的声明放在头⽂件(.h)中,函数的实现是放在源⽂件(.c)⽂件中。
【示例】
//add.c
//函数的定义
int Add(int x, int y)
{
return x+y;
}
//add.h
//函数的声明
int Add(int x, int y);
//test.c
#include <stdio.h>
#include "add.h"
int main()
{
int a = 10;
int b = 20;
//函数调⽤
int c = Add(a, b);
printf("%d\n", c);
return 0;
}
6.3 static 和 extern
static 和extern 都是C语言中的关键字。
【拓展】
作用域:是程序设计概念,通常来说,⼀段程序代码中所用到的名字并不总是有效的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
生命周期:指的是从变量的创建(申请内存)到变量的销毁(收回内存)之间的⼀个时间段。
- 局部变量的作用域是变量所在的局部范围。
- 全局变量的作用域是整个工程(项目)。
- 局部变量的生命周期是:进入作用域变量创建,生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期是:整个程序的生命周期。
6.3.1 static
static 是静态的的意思。
【用法】
- 修饰局部变量
- 修饰全局变量
- 修饰函数
6.3.2 extern
extern ⽤来声明外部符号。
【用法】
- extern的作用范围是整个工程,是共享性的。
- 置于变量或者函数前,以标示变量或者函数的定义在别的文件中(也可能是本文件),可以有多个声明,但只能有一个定义。
- 与"C"连用,如extern “C” void fun();告诉编译器按C的规则去翻译。
- extern就是专门用来声明全局变量的,函数内定义的对象不能被extern声明。
6.3.1 两者区别
-
static修饰的全局是内部链接性,内部链接性在编译单元间不共享;而extern是整个工程全局共享的。
-
static修饰全局变量时,声明和定义是同时给出的;extern则是在一处定义,其他地方都是声明。
-
它们不能同时修饰一个变量。
结语
以上就是小编对函数的讲解。
如果觉得小编讲的还可以,还请一键三连。互三必回!
持续更新中~!