函数
函数是个啥
在初中的时候,我们就接触过函数,比如一次函数,二次函数等,
在C语言中也引入了函数的概念,有些翻译为子程序,C语言的函数就是一个完成特定项目任务的一小段代码
在C语言中我们一般会见到两种函数
- 库函数
- 自定义函数
库函数
C语言的国际标准ANSI C规定了一些常用的函数标准,被称为标准库,不同的编译器厂商根据ANSI提供的C语言标准就给出了一系列的函数的实现,这些函数被称之为库函数
其实库函数我们之前都见过,像printf
,scanf
库函数的网站
C/C++d的官方的链接:
https://zh.cppreference.com/w/c/header
可以再上面查到库函数的信息
头文件的包含
库函数是在标准库中对应的头文件中声明的,所以库函数的使用,必须包括对应的头文件
#include <stdio.h>//这就是要调用printf函数所声明的头文件
int main ()
{
printf("er")
return 0;
}
函数的语法形式
ret_type name (形式参数)
{
}
其中的ret_type
是函数的返回类型,函数运行完返回值的类型,如果没有返回值,可以写void,就是无返回值
name
是函数的名字,要用英文写
括号里面的形式参数
,参数就是要给函数的值,函数运行需要的值,假如是printf函数
那么要给函数的值就是要打印的值
{}
括起来的就是函数体,就是函数的主体,是计算完成的过程
让我们来举个栗子
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = add(a,b)
printf("%d",c)
return 0;
}
这里,我们引用了一个add函数,那么这个函数是干嘛的呢,我们来创建这个函数
int add(int x ,int y)
{
return x + y;
}
int
因为函数计算的值是整型,函数返回的值也是整型,add
是函数名字,括号里的int x int y
是形式参数,因为需要输入两个整型变量,就需要两个形式参数,还必须是整型,{}
里面是计算的过程,return
返回x+y的值,这个就是函数的内容解析
所以完整的函数就是
#include <stdio.h>
int add(int x ,int y)
{
return x + y;
}
int main()
{
int a = 0;
int b = 0;
int c = add(a,b)
printf("%d",c)
return 0;
}
实参
当在调用add
函数时,传递给函数的参数a
和b
就是实际参数,被称为实参
实际参数就是真实传递给函数的参数
形参
在定义函数的时候,在函数名add
后的括号中写的x
和y
,称为形式参数
为什么叫形式参数呢?如果只是定义了函数而不去调用的话,add
函数的函数x
和y
只是形式上存在的,不会向内存申请空间,不会真实存在,所以叫形式参数。形式参数只有在函数被调用的过程中为了存放实际参数传递过来的值,才会向内存申请空间,这个过程就是形参的实例化
在代码运行的时候,x和y确实获得了a和b的值,但是x和y的地址和a和b的地址不一样的,所以我们理解为形参是实参的一份临时拷贝文件
return语句
return语句
是函数中极为重要的一部分
return
后面可以是数值也可以是表达式,也可以什么都没有,直接写return,这种情况适合函数返回类型是void的情况return
返回的值和函数返回的值的类型不一致,系统会自动返回的值转换为函数的返回类型- 如果
return
在if
后面等分支函数后面,则要确保每种情况下都有return,不然会报错
数组也可以做函数参数
如果一个函数里需要用到数组,那么数组也可以成为函数参数
#include <stdio.h>
int nb(arr[],i);
{
for(i=0,i<10,i++)
{
arr[i] = 0;
}
return arr;
}
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
nb(arr,i);//arr是地址
return 0;
}
函数嵌套调用
函数中可以嵌套调用,就是在函数的定义中嵌套另一个函数
链式访问
链式访问就是讲一个函数的返回值作为另一个函数的参数,像链条一样串联起来
int len(i)
{
...
}
printf("%d",len("2"));
这个就是链式访问,printf的参数是len函数返回的结果
函数的声明和定义
正常来说,一个带有函数的变量是这样的
#include <stdio.h>
int add(int x ,int y)
{
return x + y;
}//函数的定义
int main()
{
int a = 0;
int b = 0;
int c = add(a,b);//函数的调用
printf("%d",c)
return 0;
}
但是如果把定义放到函数的调用后面
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = add(a,b);//函数的调用
printf("%d",c);
return 0;
int add(int x ,int y)
{
return x + y;
}//函数的定义
}
这时代码就会报错因为编译器是从前往后扫描的,在函数调用前没有看到函数的定义
这时我们需要声明一下函数,函数的声明只需要交代清楚函数名,函数的返回类型和函数的参数
#include <stdio.h>
int add(int x ,int y)//函数的声明
int main()
{
int a = 0;
int b = 0;
int c = add(a,b);//函数的调用
printf("%d",c)
return 0;
int add(int x ,int y)
{
return x + y;
}//函数的定义
}
函数的调用一定要满足先声明后调用
函数的定义也是一种特殊的声明
多个文件
在企业写代码时,我们往往会把代码拆到多个文件中
一般情况下,函数的声明,类型的声明放在头文件中(.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);
return 0;
}
总结来说,函数的定义可以放到一个.c文件中,函数的声明可以放到一个.h文件中,函数的调用可以放到主要的.c文件中
static和extern
static
和extern
都是C语言中的关键字
static
是静态的意思,可以用来:
- 修饰全局变量
- 修饰局部变量
- 修饰函数
extern
是用来声明外部符号的
在讲解他们的时候,我们先要来讲解一下作用域与生命周期
作用域
局部变量的作用域是变量所在的局部位置
全局变量的作用域是整个工程
生命周期
局部变量的生命周期是:进入作用域变量创建,生命周期开始,出作用域生命周期结束
全局变量的生命周期是:整个程序的生命周期
static
修饰局部变量改变它的生命周期和程序的生命周期一样,但是作用域不变
修饰全局变量,使得变量只能在本源文件中作用,不能作用于其他源文件
extern
extern
用来声明外部符号
如果一个全局变量在A文件里定义,在B文件里使用,就可以在B文件中对此全局变量进行声明,就能在B文件中正常使用
如果一个全局变量只想在所在的源文件中使用,不想被其他文件发现,就可以使用static
修饰
如果觉得有用可以点一下赞和关注,也可以先收藏以防需要时找不到哦,当然如果作者写的哪里有问题欢迎指出,我们一起进步!!!
祝看到这里的人天天开心哦(笔芯)