1. 为什么要用函数
1.1 如果程序的功能比较多,规模比较大,所有的代码都写在一个主函数里面,不会使得主函数变得很庞杂,看着很乱,使阅读者阅读程序会感觉到困难。因此,人们会想到,利用函数去简化程序设计的过程。我们可以事先编好一批常用的函数来实现不同的功能,调用时直接在程序中调用系统函数的函数代码,并执行就可以得到预期结果。
1.2 所在函数库
①. 字符库函数:【ctype.h】
②. 数学函数:【math.h、stdio.h、string.h、float.h】
③. 目录函数:【dir.h、dos.h】
④. 进程函数:【stdlib.h、process.h】
⑤. 诊断函数:【assert.h、math.h】
⑥. 操作函数:【string.h、mem.h】
1.3 函数就是功能,每一个函数用来实现一个特定的功能函数的名字反应,其代表的功能。
2. C语言函数的作用域
注:.text为代码区, .data是数据区, .heap是堆区,.stack是栈区。
2.1 定义:生存期也叫生命期。指的是标识符从程序开始运行时被创建,具有存储空间,到程序运行结束时消亡,释放空间的时间段。
注:此阶段针对的是程序的执行过程。
2.2 局部变量的生存期:函数被调用,分配存储空间,到函数执行结束,存储空间释放。局部变量存储在栈区.stack。
2.3 全局变量的生存期:从程序行前开始,到执行后结束。全局变量存储在数据区.data。
2.4 动态生存期: 标识符由特定的函数调用或运算来创建和释放,比如调用malloc() 为变量分配存储空间,变量的生存期开始,而调用free() 释放空间或程序结束时,变量生存期结束。具有动态生存期的变量存储在堆区.heap。
3. 定义函数的方法
类型名 函数名(形式参数列表)
{
函数体
}
函数体包括声明部分和语句部分。
4. 函数调用的形式
函数名(实参列表)
注:在调用有参函数时,主调函数和被调函数之间有数据传递的关系,在定义函数时,函数名后面括号中的变量名称为“形式参数”,在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”。
函数可以没有返回值(void),最多返回一个该如何处理?
1.将main函数名改成合适的名称。
2.不通过scanf获取数据,通过参数列表传递数据。
3.返回值,将函数体执行的结果返回。 当需要通过printf输出时应该考虑返回值.在功能函数中不要输出数据。
注意:通过返回值返回和通过printf输出的区别。
5. 程序实例
求1+2+3+4+5+....+n
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int getsum(int n) { //形式参数列表
int res = 0;
for (int i = 1; i <= n; i++) {
res += i;
}
return res;
}
int main() { //使用printf scanf
//主程序-main函数 --> 测试功能(printf,scanf)
int res = getsum(10); //实际参数列表
printf("%d\n",res);
return 0; // 0 代表main 成功退出
}
运行结果:
总结:
使用c语言中的函数可以将一段代码进行封装,在需要使用的时候直接调用即可;使程序更加清晰,方便阅读,易于维护,可提高代码的重用性。