目录
编写一个函数 swap(int *n1, int *n2) 可以交换 n1 和 n2的值
返回类型 函数名(形参列表){
执行语句……;//函数体
return 返回值;//可选
}
①形参列表:表示函数的输入
②函数中的语句:表示为了实现某一功能代码块
③函数可以有返回值,也可以没有,如果没有返回值,返回类型类型为void
- #include
-
- //说明
- //1. 函数名 cal
- //2. 有返回值 double
- //3. 形参列表为 (int n1, int n2, char oper)
- //4. 在函数中,我们使用的变量名需要和形参列表中的变量名一样
- double cal(int n1, int n2, char oper) {
-
- //定义一个变量 res ,保存运算的结果
- double res = 0.0;
-
- switch(oper) {
- case '+' :
- res = n1 + n2;
- break;
- case '-':
- res = n1 - n2;
- break;
- case '*':
- res = n1 * n2;
- break;
- case '/':
- res = n1 / n2;
- break;
- default :
- printf("你的运算符有误~");
- }
- printf("\n%d %c %d = %.2f\n", n1, oper, n2, res);
- return res;
- }
-
- void main() {
-
- int num1 = 10; //第一个数
- int num2 = 20;//第二个数
- double res = 0.0;//结果
- char oper = '-'; //运算符
-
-
- //我们又要接收两个数和一个运算符
- int num3 = 60;
- int num4 = 80;
- double res2 = 0.0;
- char oper2 = '*';
-
- printf("使用函数来解决计算任务~~");
- //使用函数来完成两个计算任务
-
- res = cal(num1, num2, oper); //调用函数,使用函数
-
- printf("cal 函数返回的结果 res = %.2f\n", res);
-
-
- //使用函数完成第二个计算任务
- res2 = cal(num3, num4, oper2); //调用函数,使用函数
- printf("cal 函数返回的结果 res2 = %.2f", res2);
- }
①执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)
②函数的局部变量是独立的,不会相互影响
③递归必须向推出递归的条件逼近,否则就是无限递归
④当一个函数执行完毕,或者遇到return,就会返回
①当调用(执行)一个函数时,就会开辟一个独立的空间(栈)
②每个栈空间是相互独立
③当函数执行完毕后(或者执行到return),会返回到调用函数位置,继续执行
④如果函数有返回值,则将返回值赋给接收的变量
⑤当一个函数返回后,该函数对应的栈空间也就销毁
- void test(int n) {
- int n2 = n + 1;
- printf("n2=%d", n2);
- }
- void main() {
-
- int num = 6;
- test(num);
- getchar();
- }

- void test(int n) {
- if(n > 2) {
- test(n -1);
- }
- printf("\nn=%d", n);
- }
-
- void main() {
-
- test(4); //输出2
调用函数时,开辟的函数栈,都会完整的执行函数代码

- //题1:斐波那契数请使用递归的方式,
- //求出斐波那契数1,1,2,3,5,8,13...给你一个整数n,求出它的斐波那契数是多少?
- #include
-
- int fbn(int n) {
- if (n == 1 || n == 2) {
- return 1;
- }
- else {
- return fbn(n - 1) + fbn(n - 2);
- }
- }
-
- void main() {
- int res = fbn(7); // res = 13
- printf("\nres=%d", res);
- getchar();
- }
- /*题2:求函数值已知 f(1)=3; f(n) = 2*f(n-1)+1;
- 请使用递归的思想编程,求出 f(n)的值?
- 分析:因为该题的公式已经给出,所以直接使用即可
- */
- //f(1)=3; f(n) = 2*f(n-1)+1
- int f(int n) {
- if(n==1) {
- return 3;
- } else {
- return 2*f(n-1)+1;
- }
- }
-
- void main(){
- int res2 = f(30);
- printf("\nres2=%d", res2);
- getchar();
- }
- /*题3:猴子吃桃子问题有一堆桃子,猴子第一天吃了其中的一半,
- 并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。
- 当到第十天时,想再吃时(还没吃),发现只有1个桃子了。问题:最初共多少个桃子?
- 分析:
- 1. day=10 有 1个桃子
- 2. day=9 有 (day10 + 1) * 2 = (1+1) * 2 = 4
- 3. day=8 有 (day9 + 1) * 2 = (4+1) * 2 = 10
- */
- int peach(int day) {
- if(day == 10) {
- return 1;
- } else {
- return (peach(day+1) + 1) * 2;
- }
- }
- void main(){
- int peachNum = peach(1);
- printf("\n 第一天有%d个桃子", peachNum);
- getchar();
- }
函数的形参列表可以是多个
C语言传递参数可以是值传递,也可以传递指针,也叫引用传递
函数的明明遵循标识符命名规范,首字母不能是数字,可以采用驼峰法或下划线法
函数中的变量是局部的,函数外不生效
基本数据类型默认是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值
如果希望函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内用指针的方式操作变量。从效果上看类似引用(即传递指针)
- void f2(int n) {
- n++;
- printf("f2中n的值是%d\n", n);//10
- }
- void f3(int* p) {
- (*p)++;//修改会对函数外的变量有影响
- //main函数中的n变量也发生改变
- printf("f3中n的值是%d\n", *p);//
- }
-
- void main() {
-
- int n = 9;
- f2(n);
-
- f3(&n);
-
- printf("main函数中的n = %d", n);//f2之后仍是9,但f3之后成为10
- }

C语言不支持函数重载
C语言支持可变参数函数
- #include
-
- //请编写一个函数swap(int* n1,int* n2)可以交换n1和n2的值
- //形参是两个指针类型int*
- void swap(int* n1, int* n2) {
- int temp = *n1;//表示将n1指针指向的变量的值赋给temp
- *n1 = *n2;//表示将n2指针指向的变量的值赋给n1指针指向的变量
- *n2 = temp;//表示将temp的值赋给n1指针指向的变量
- }
-
- void main() {
- int n1 = 1;
- int n2 = 2;
- swap(&n1, &n2);
- printf("main n1 = %d n2 = %d", n1, n2);//n1 = 2 n2 = 1
-
- getchar();
- }

