c语言函数, 函数调用及函数递归

时间:2023-03-09 01:04:43
c语言函数, 函数调用及函数递归

1. 函数的定义: 返回值类型 函数名(形参列表) {函数体(函数的实现内容)}, 注意: 如果没有参数, 小括号也是必不可少的.

   函数与函数之间可以嵌套调用(也就是在一个函数内部可以调用另外一个函数), 但是不能嵌套定义(不能在一个函数内部定义另外一个函数)

  形参: 形式上的参数, 在函数定义时, 给定的参数叫做形参, 是一个一个的变量, 存储的数据在调用之前完未知

  实参: 函数调用时给定的参数叫做实参, 是一个唯一确定的数据. 实参向形参传递的过程是一个拷贝的过程

  函数相当于公司的部门, 每一个部分完成特定的功能, 部门与部门之间的并列关系决定了函数与函数之间也是并列关系

  函数的功能: 实现代码的模块化管理. 把复杂的逻辑进行拆分, 而主函数只起到宏观调控的功能即可, main函数是应用程序执行的入口

  函数定义过程中可能出现的错误:

    a. Function definition is not a allowed here: 原因: 函数内部又定义了一个新的函数, 嵌套定义

     solution:函数之间是并列关系, 把内部定义的函数定义在外部

    b. Control reaches end of non-void function: 原因: 返回值不能为空, 函数内部没有通过return返回数据

     solution: 通过return返回对应数据

2. 函数定义形式:

  a. 函数定义第一种形式: 无参数, 无返回值

    void buyMike() {

    printf("还没给钱\n");

    }

    函数名的命名规范: 有多个英文带刺组成, 除了第一个单词的首字母小写, 其余单词首字母大写

  b. 函数定义的第二种形式: 有返回值, 无参数

    float salary() {

    printf("同志们今年干的不错, 明年好好干, 不要跳槽\n");

     return 1.0;//ruturn 将该函数的值返回给主调函数

         //千万不要把代码放到return下面, 会执行不到

    }

  c. 函数定义的第三种形式: 无返回值, 有参数

    void buyMike2(float money) {

    if (money < 10) {

    printf("钱不够\n");

    } else {

     printf("OK, 买了牛奶\n");

     }

    }

  d. 函数定义的第四种形式: 有返回值, 也有参数

    //求两个数的最大值

    int maxValueOfTwo(int a, int b) {

      return a > b ? a : b;

    }

    //求两个数的最小值

    int minValueOfTwo(int a, int b) {

      return a < b ? a : b;

    }

    //求三个数的最大值

    int maxOfThreeNumber(int a, int b, int c) {

    //1.先求a与b的最大值max

      //int max = 0;//存储最大值

     //max = maxValueOfTwo(a, b);

    //2.再求max与c的最大值

    return maxValueOfTwo(maxValueOfTwo(a, b), c);

    }

3.函数调用(让函数干活)

  a. 无返回值的函数: 函数名(传递的是实参表); 如buyMike2(3.2);

  b. 有返回值的函数: 定义一个和返回值类型对应的变量, 用来接收函数调用返回的值. 如: int max  = maxValue(2, 3);

4. 数组与函数的关系, 数组作为函数的参数:

  a. 当数组作为函数参数时, 只传递函数名称如int a[10] = {0}; outputArray(a, 10);//outputArray(int arr[], int n)是自己定义的一个函数

5. 函数的使用分为三部分:(在xcode中)

  a. 函数声明, 类似于使用说明书, 写在.h文件中

  b. 函数定义(函数的实现),实现写在.m文件中

  c. 函数的调用(导入头文件, 本质就是将.h文件中的内容全部拷贝到该文件中)

6. 变量的作用域: 变量可访问的范围

  局部变量: 在函数内部定义的变量叫做局部变量, 只在函数内部可访问, 函数执行时开辟空间,  函数执行结束空间自动回收

  全局变量: 在函数外部定义的变量叫做全局变量, 在全局都可访问, 空间不会回收(warning:全局变量非常危险, 使用需谨慎)

  静态变量: 凡是被static修饰的变量都叫静态变量.

特点: 1. 如果不赋初值, 默认为0

  2. 只初始化一次(该变量只会定义一次)

3. 空间一旦开辟, 不会回收

7. 函数递归: 函数的递归是调用一个与自己功能完全相同的函数(注意: 递归一定要有出口, 否则会造成死循环), 如:

  

  //函数模拟吃苹果

  void eatApple(int n) {

   //一旦发现苹果个数为0, 通过return结束当前函数执行  

  //递归一定要有出口, 否则会造成死循环

   if (n == 0) {

    return;//返回空

  }

  //如果不为零

  //1. 留一个苹果

      n--;

  //2. 找下一个人来吃苹果

   eatApple(n);

   //3. 吃自己手中的苹果

   printf("第%d个人吃苹果:\n", 10 - n);

  }

 在main函数中直接进行函数调用即可: eatApple(10);

  //倒序报数54321

  void reverse(int n) {

  if (n == 0) {

    return;

     }

    //1. 留个数

    int m = n % 10;

   //2. 报数

  printf("%d", m);  

  //3. 找下一个人报数

  reverse(n / 10);

  }

  //正序

  void positive(int n) {

   if (n == 0) {

  return;

  }

  //1. 留个数

  int m = n % 10;

  //2. 找下一个人报数

  positive(n / 10);

  //3. 报数

  printf("%d", m);

  }

  //阶乘

  int fac(int n) {

  if (n == 0 || n == 1) {//0和1的阶乘都为1

   return 1;

   }

  return n * fac(n - 1);

  }