C语言程序是有函数组成的.函数是C语言的基本模块,通过对函数模块的的调用来实现特定的功能
什么是函数
函数就是一段具备特定功能的程序段
函数的格式
返回值类型 函数名称(型参列表){
函数体;//语句
}
函数的调用过程
// 注意: 形参列表中的变量只有当函数被调用时才会分配存储空间
// 形参列表中的每一个变量我们称之为, 形式参数, 简称形参
int average(int v1, int v2)
{
int average = (v1 + v2) / 2;
return average;
}
int main(int argc, const char * argv[]) {
// 需求: 求两个数的平均值
int a = 10;
int b = 20;
// 调用函数时传入的参数, 我们称之为实际参数, 简称实参
int result = average(a, b);
printf("result = %i\n", result);
return 0;
}
调用过程内存分析
函数注意点
- 如果"基本数据类型"(char int double float)作为函数的参数, 在函数中修改形参的值, 不会影响到外面实参的值
- 实参的个数, 必须和形参的个数相同
- 返回值可以和返回值类型不一样,但是如果返回值和返回值类型不一样的时候
系统会对返回值进行自动类型转换(隐式类型转换), 将返回值转换为返回值类型 - 函数可以有形参也可以没有形参
- 函数可以有返回值, 也可以没有返回值
1.如果函数没有返回值, 那么返回值类型就写viod
2.如果函数没饭返回值, 那么可以不写return, 但是如果写了return也不会报错 - return的应用场景
1.用于在函数中返回结果给函数调用者
2.结束函数
3.提前结束函数
4.return后面不可以写任何语句, 因为执行不到
- 函数名称不能相同
- 函数不能嵌套定义
- C语言是弱语言(函数可以没有返回值类型; 如果函数没有写返回值类型, 那么默认就是int类型)
函数的声明和实现
- 在C语言中,函数定义顺序是有讲究的,默认情况下,只有后面定义的函数才可以调用前面定义过的函数
- 如果想把函数的定义写在main函数后面,而且main函数能正常调用这些函数,那必须在main函数的前面进行函数声明
- 函数声明格式
返回值类型 被调函数名(类型 形参,类型 形参);
返回值类型 被调函数名(类型,类型 );
- 如果被调函数的返回值是整型时,可以不对被调函数做说明,而直接调用,这时系统将自动对被调函数返回值按整型处理
main函数的分析
// main是函数的名称, 是系统规定的名称, 系统启动程序就会调用名称叫做main的函数
// main函数只能由系统调用 ,不能手动调用
// 其实系统在启动程序的时候, 会给我们的程序传递一些参数
// argc : 就是系统传递进来的参数个数, 默认是1
// argv : 就是系统传递进来的参数实际的值, 默认是程序的名称
int main(int argc, const char * argv[]) {
printf("argc = %i\n", argc);
printf("argv = %s\n", argv[0]);
printf("argv = %s\n", argv[1]);
// return 结束函数
// 0 : 返回给操作系统, 如果返回0, 代表程序整除结束, 如果返回其它值代表程序非正常结束
return 0;
}
-
添加系统传进来的参数
递归函数
int main(int argc, const char * argv[]) {
// 一般情况下, 能用循环做得事情, 用递归函数都能做
// 但是要注意: 不是什么时候都使用递归, 递归要慎用(性能问题)
// 什么是递归函数: 函数自己搞自己
scanfNumber();
// 注意: 递归一定要由一个明确的结束条件, 否则会造成死循环(无限循环
return 0;
}
void scanfNumber()
{
// 1.接收用户输入的值
int number = -1;
printf("请输入一个大于0的整数, 以回车结束\n");
scanf("%i", &number);
// 2.判断用户输入的值是否合法
if (number < 0) {
// 不合法, 需要重新输入
// 函数可以自己调用自己
scanfNumber();
}else
{
printf("number = %i\n", number);
}
}
网友评论