六、C语言-函数
1.为什么需要函数
- 避免重复性操作
- 有利于程序的模块化
2.什么叫函数
- 逻辑上:能够完成特定功能的独立的代码单元
- 物理上:能够接收数据,能够对接收的数据进行处理,能够将数据的处理结果返回
- 总结:函数是个工具,它是为解决大量类似问题而设计的。函数可以当个黑匣子
3.如何定义函数
函数的返回值 函数的名字(函数的形参列表)
{
函数的执行体
}
- 函数的定义的本质是详细描述函数之所以能够实现某个特定功能的具体方法
- return表达式;的含义:
(1) 终止被调函数,向主调函数返回表达式的值
(2) 如果表达式为空,则终止函数,不向被调函数返回任何值
例子:
void f()
{
return;//终止被调函数
}
int f()
{
return 10;//终止被调函数,并向主调函数返回10
}
- break是用来终止循环和switch的,return是用来终止函数的
- 函数返回值的类型也称为函数的类型,如果函数名前面的返回值类型和函数执行体中的return表达式;中表达式的类型不同的话,以函数名前面的返回值类型为准。
4.函数的分类
- 有参函数和无参函数
- 有返回值和无返回值
- 库函数和用户自定义函数
- 值传递函数和地址传递函数
- 普通函数和主函数(main):一个程序必须有且必须有一个主函数,主函数可以调用普通函数,普通函数不能调用主函数。普通函数可以相互调用。主函数是程序的入口,也是程序的出口。
- 函数的功能尽量单一
5.注意的问题
函数调用和函数定义的顺序
如果函数调用写在函数定义的前面,则必须加函数前置声明。
函数前置声明:
(1) 告诉编译器即将可能出现的若干个字母代表的是一个函数
(2) 告诉编译器即将可能出现的若干个字母代表的函数的形参和返回值的具体情况。
(3) 函数声明是一个语句,末尾必须加分号
(4) 对库函数的声明是通过# include<库函数所在的文件的名字.h>来实现的
形参和实参
个数相同
位置一一对应
数据类型必须兼容
如何在软件开发中合理地设计函数来解决实际问题
一个函数的功能尽量独立,单一
多学习,多模仿牛人的代码
函数是C语言的基本单位,类是java,c#,c++的基本单位
6.常用的系统函数
double sqrt(double x);
求x的平方根
Int abs(int x);
求x的平均值
double fabs(double x);
求x的绝对值
7.递归
栈:先进后出
递归:A调用A
可以参考数据结构视频
8.变量的作用域和存储方式
按作用域分:全局变量和局部变量
按存储方式分:静态变量,自动变量,寄存器变量
全局变量
在所有函数外部定义的变量叫全局变量
全局变量使用范围:从定义开始到整个程序结束
int k = 200;
void f(int i)
{
int j = 20;
printf("k = %d\n", k);
}
K是全局变量
局部变量
在一个函数内部定义的变量或者函数的形参统称为局部变量
void f(int i)
{
int j = 20;
}
I和j都属于局部变量
- 使用范围:只能在本函数内部使用
- 全局变量和局部变量的命名冲突问题:在一个函数的内部如果定义的全局变量和局部变量的名字一样时,局部变量会屏蔽掉全局变量。
变量类型 | 定义位置 | 存储位置 | 生命周期 | 默认初始化 |
---|---|---|---|---|
全局变量 | 所有函数外部 | 全局/静态区(数据区) | 程序开始到程序结束 | 是(0 或 nullptr) |
局部变量 | 函数或代码块内部 | 栈区 | 函数或代码块执行期间 | 否(随机值) |
静态变量 | static 修饰的局部或全局 | 全局/静态区(数据区) | 程序开始到程序结束 | 是(0) |
寄存器变量 | register 修饰的局部变量 | 寄存器或栈区 | 函数或代码块执行期间 | 否(随机值) |
动态分配变量 | 动态分配(new 或 malloc ) | 堆区 | 显式释放或程序结束 | 否(不确定) |