C语言笔记——6.函数及递归

六、函数

1. 函数基本概念

函数:理解为封装功能的容器。

函数的定义的基本格式:

//返回值类型  函数名(形参列表)
//{函数体}
int One(int a,int b)//a,b是形参
{
    return a+b;
}
int main()
{
   printf(One(1,2));//1,2是实参
   return 0;
}

注:

  1. 返回值类型:常用的基本数据类型,函数执行完了之后,函数得到一个什么类型的值。通过 return返回,写在函数最末尾。如果不需要返回一个值,则返回值类型就用 void.
  2. 调用函数时,会把实参传给形参,对应位置进行传参。
2. 局部变量&全局变量
  1. 局部变量:作用域在一定的域内才能被使用的变量,出了自己的祖宗用于就会被释放掉。

  2. 全局变量:定义开始往下,所以的地方都可以使用,子啊程序结束的时候被释放。如果没有给全局变量进行赋值,系统默认赋值为0.

  3. 注意:全局变量和局部变量可以同名,就近原则使用。

  4. 静态变量:在程序执行后定义,生命周期是程序结束后才死亡,且只会被定义1次。

    int main()
    {
        int q;
        for(int i=0;i<10;i++)
        {
            static int a=10;//在for前后无所谓
            a++;
            printf("%d\n",a); //11 12 13 14 15 16 17 18 19 20
        }
        return 0;
    }
    

    注:q:在栈区,系统自动申请内存,程序结束之后自动释放内存。

    a:在静态全局区,第一次循环,a=11,第二次执行到static int a=10;时,申请内存失败,继续执行a++,一直到循环结束。

3. 函数嵌套
  1. 址传递

    在定义变量、数组、函数等,系统会分配内存区域(地址),把数据放到这个地址上。

  2. 一些概念

    &:取地址符号,&a得到a的地址编号。

    ***:**定义指针变量的标志。可以存地址。int *d = &a

    ***:**第二个作用,解引用,取内容。

    指针变量:存储地址的变量

    整型变量:存储整数的变量

  3. 需要搞明白

    (1)怎么定义一个变量存储地址—>指针变量

    (2)怎么获取一个变量的地址&

    (3)怎么通过指针变量访问指针变量上所保存的地址内部的数据

  4. 址传递能够通过形参改变实参的值

    void fun(int *p1)
    {
        printf("%d\n",*p1);
        *p1 = 1000; //改变值,通过形参改变形参的值
    }
    int main()
    {
        int a = 10;
        fun(&a);  //输出10
        printf("%d\n",a); //1000
    }
    
  5. 函数的递归

    void fun()
    {
        static int i = 10;//如果是int i=10,将报错,无法递归
        if (i != 0)
        {
            i--;
            fun();
        }
        printf("%d\n",i);
    }
    int main()
    {
        fun(); //输出11个0,这是递归的真正含义,当i=0,才printf 0,之前所有的没执行的printf,经过递归,全部输出。可以在此处打断点调试一下
        return 0;
    }
    

    实例1:倒序输出

    void fun(int n)
    {
        if (n != 0)
        {
            printf("%d\n",n%10);
            fun(n/10);
        }
    }
    int main()
    {
        fun(1234); //4321
        return 0;
    }
    

    实例2:斐波那契数列 1 1 2 3 5 8 13 21…

    int fun(int n)
    {
        if (n==1||n==2)
            return 1;
        else
            return fun(n-1)+fun(n-2);
    }
    int main()
    {
        printf("%d\n",fun(10)); //注意不能太大,会超出int范围
        return 0;
    }
    

    实例3:猴子吃桃:第一天摘下若干桃子,当即吃了一半,不过瘾,又多吃了一个,第二天又将剩下的吃掉了一半,且多吃了一个,以后每天如此,到第10天的时候,发现只剩下一个桃子,问第一天的时候总共摘了多少个桃子。用递归的方式???(作业)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼才的凝视

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值