C语言·函数1

目录

函数的声明与定义

主函数与其他函数之间的关系

递归调用


函数的声明与定义

函数的定义是指对函数功能的确立,包括指定函数名、函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。

函数的声明的作用是把函数的名字、函数类型及形参的类型、个数和顺序通知编译系统以便在调用该函数时编译系统能正确识别函数并检查调用是否合法。

(隐式声明:C语言中有几种声明的类型名可以省略。例如:函数名如果不显式地声明返回值的类型,那么它默认返回整型;隐式声明不是好习惯)。

定义:

函数名类型标识符 函数名(形式参数列表,有或无形参都可 ,每一个形参必须分开定义参数类型)

{

        声明部分

        语句部分

}

实参与形参的说明:

定义函数中指定的形参,如果没有函数调用,并不会占用内存中的存储单元。只是在发生函数调用时,我们定义的函数中的形参才会被分配内存单元。在调用结束后,形参所占的内存单元也会被释放。主函数传递过来的参数是实际参数,在数量方面和形参要一一对应,实参可以是常量,变量,表达式,但要求它们有确定的值。形参与实参的类型应该相同或者赋值兼容。实参向形参的数据传递时单向"值传递",只能由实参传递给形参。

全局变量:在所有的函数(包括主函数)外,定义的变量是全局变量。全局变量i存储在数据段,所以main函数和print函数都是可见的。全局变量不会因为某个函数执行结束而消失,在整个进程的执行过程中始终有效。如果局部变量与全局变量重名,就采取就近原则,即实际获取和修改的值是局部变量的值。

主函数与其他函数之间的关系

在程序编译时是以源程序文件为单位而不是以函数为单位进行编译的。

函数间的调用关系是:由主函数调用其他函数,其他函数也可以相互调用,同一个函数可以被一个或者多个函数任意调用任意次。C语言的执行从main函数开始,如果在main函数中调用其他函数那么在调用后会返回到main函数中,在main函数中结束整个程序的运行。

所有的函数都是平行的,即在定义函数时是分别进行的,并且是互相独立的。一个函数并不属于另一个函数,函数不可以嵌套定义。函数间可以互相调用,但不可以调用主函数,主函数由系统调用。

 例:

#include<stdio.h>

//函数调用
int printstar(int i)//函数声明,声明函数printstar,i为形式参数
{
    printf("*****************\n");
    printf("printstar %d\n",i);
    return i+3;
}
    
void print_message()//可以调用printstar
{
    printf("how do you do \n");
    printstar(3);//函数调用
}

int main()
{
    int a = 10;
    a = printstar(a);
    print_message();
    printstar(a);
    return 0;
}

运行结果:

*****************
printstar 10
how do you do 
*****************
printstar 3
*****************
printstar 13

??????这个输出不理解。

递归调用

题目:假如有n个台阶,一次只能上1个台阶或2个台阶,请问走到第n个台阶有几种走法?

解析:假如有3个台阶,那么总计就有3种走法:第一种为每次上1个台阶,上3次;第二种为先上2个台阶,再上1个台阶;第三种为先上1个台阶,再上2个台阶。

#include<stdio.h>

//n的阶乘的递归调用实现
/**
 * @brief 
 * 假如有n个台阶,一次只能上1个台阶或2个台阶,请问走到第n个台阶有几种走法?
 * 解析:假如有3个台阶,那么总计就有3种走法:第一种为每次上1个台阶,上3次;
 * 第二种为先上2个台阶,再上1个台阶;第三种为先上1个台阶,再上2个台阶。
 */
// n = 1 specie = 1
// n = 2 specis = 2     1+1= 2
// n = 3 specis = 3   1+ 2 =3
// n = 4 specis = 5   2+3 =5
// n = 5 specis = 6   5+ 3= 8
// 1 1 1 1     1 1 2       1 2 1       2 1 1       2 2
// 11111   1112    1121    1211    2111    122  212 221

//计算k个台阶有几种走法
int specie(int n)
{
    if (n == 1)
    {
        return 1;
    }
    else if (n == 2)
    {
        return 2;
    }   
    else
    {
        return specie(n-1)*specie(n-2);
    }    
}

int main()
{
    int n,ret;//一共有n个台阶
    printf("请输入楼梯数:\n");
    scanf("%d",&n);
    ret = specie(n);
    
    printf("一共有%d种上楼梯方法 \n",specie(n));
    return 0;
}

控制台:

请输入楼梯数:
6
一共有32种上楼梯方法 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Wmpreturn

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

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

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

打赏作者

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

抵扣说明:

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

余额充值