14天阅读挑战赛
1.函数定义
-
函数的组成部分
函数返回值类型 函数名(形参)
{
函数体;
return 返回值;
}
注意:
函数返回值类型必须和return后面的数据类型一致
//每个C语言程序必有的一个函数
int main()
{
return 0;
}
/*
int : 返回值类型 ,
main : 函数名(其实就是标识符,就是一个名字)
() : 描述参数
return 0 : 函数返回值
*/
//函数中没有参数,可以用void表示
int main(void)
{
return 0;
}
void main()
{
//这种函数返回值类型为void
//没有return 0;这种形式,但是可以写成return;
}
- 函数调用: 函数名(函数参数)
#include <stdio.h>
void hanshu(int x)
{
printf("x=%d",&x);
return;
printf("函数结束");
}
int main()
{
hanshu(3); //调用函数
}
return的作用:结束当前函数,后面的语句将不会执行
2.函数参数
- 无论传入什么参数,都是用赋值的方式
- 两种参数方式
- 值传递
- 地址传递
(1)值传递,这里main函数的aa值没有发生变化
(2)地址传递,这里main函数的aa值发生了变化
当函数需要修改实参的时候,需要传入实参的地址
①函数中修改普通变量,要传入普通变量的地址(一级指针),在函数中用的是:*指针(一级)
②函数中修改一级指针,需要传入一级指针地址(二级指针),在函数中用的是:*指针(二级)
#include <stdio.h>
// 每一个函数都有独立一个运行空间(栈区)
void modify1(int a) //int a = aa = 999
{
a = 100;
printf("modify1中a的值为:%d\n", a);
}
void modify2(int* a)
{
*a = 100;
printf("modify2中*a的值为:%d\n", *a);
}
int g_num = 678; //设置全局变量
void modify3(int** p)
{
*p = &g_num;
}
int main()
{
int aa = 999;
//modify1(aa);
//printf("main中aa的值为:%d\n", aa);
//modify2(&aa);
//printf("main中aa的值为:%d\n", aa);
int* p = &aa; //*p等效于aa
printf("main中*p的值为:%d\n", *p);
modify3(&p);
printf("main在调用modify3后*p的值为:%d\n", *p);
}
- 形参:函数定义的参数
- 实参:函数调用时的参数
#include <stdio.h>
int Max(int a, int b) //形参 int a, int b
{
//int a=5,int b=6;
return a > b ? a : b;
}
int main()
{
//调用函数时,形参和实参类型要一致
printf("%d\n", Max(5, 6)); //实参 5,6
return 0;
}
3.函数返回值
函数返回值函数调用后的唯一遗留物
4.函数递归调用
- 调用方式:函数名(函数参数)
- 函数参数必须和函数定义时候参数类型一致
- 若不一致,可以转换的不会报错,不可以转换的它就会报错
- 嵌套调用
- 以另一个函数的返回值当做参数嵌套
- 通过参数的递推,形参的递归调用(自己调用自己)
- 退出性条件
- 推导公式(数学推导,归纳法)