函数是什么,以及函数的申明以及定义

本文深入解析函数在编程中的核心概念,包括基本定义、分类(库函数与自定义函数)、参数传递(传值与传址)、调用示例、嵌套与链式访问。重点讲解了如何利用库函数提高代码效率,自定义函数的编写技巧以及函数声明与定义的组织方式。
摘要由CSDN通过智能技术生成

image

  • 任何一个代码都有函数组成,函数非常重要
  • 函数是什么


    数学中f(x) = 2x+1

    以及在cs中函数的标准定义
    一般函数有输入参数和返回值
    甚至提供对过程的分装和隐藏,这些代码被集成为软件库
  • 函数的分类
    库函数和自定义函数
    • 库函数


      但是当我们写代码时发现,大量功能重复使用,时间都浪费了
      把频繁大量使用的导出来也会让让我们更加标准,库函数是一系列函数
      standard output也就是stdout标准输出就是键盘,网站推荐
      www.cplusplus.com还可以查c++的
      还有msdn还有c++和c的官方中文网站zh.cppreference.com
      所以呢,我们怎么使用文档来学习库函数
      比如strcpy
      目的地,将arr1拷贝到arr2里去
      打印字符串%s hello bit
      memory - 记忆- 内存
      ,memset--内存设置
      更加标准和效率化库函数功能有限
    • 自定义函数
      • 函数的基本原型和函数的组成:库函数和自定义函数类型相似,模仿去用它


        函数返回类型加函数名加函数的参数
      • 写个函数,找出两个数的最大值


        写函数名 get_max(a,b);
        int max = get_max(a,b);
        这是函数的调用
        现在要函数的定义
        设置函数的参数
        函数体要做的就是正经事
        它会return谁?
        main函数就是我
        get_max是张三
        我说:张三你把两个数比较
        我说:帮我带份饭:蛋炒饭,20元
        带饭(蛋炒饭,20元) -----传参
        最后要给我返回来一份饭
        返回的z和带回来的饭是一个道理
        一个一个按f11
      • 写一个函数,交换两个整形的内容


        Swap函数(a,b);
        然后要设计参数
        一会只要a和b内容,不用返回
        什么都不用返回就用void
        函数返回类型的地方写void;表示不返回任何值,也不需要返回
        怎么交换,引入临时变量
        比如酱油和醋怎么交换,我们要借一个空瓶
        出问题了,没有交换没有完成任务
        取地址a和取地址b
        其实他们在内存开辟了b空间和a空间
        a空间的编号b空间的编号
        地址不一样
        调用函数的时候我们又为y和x创建了独立空间
        不会影响主函数a和b
        空间不一样,代码写出问题
        现在我们担心的是调用函数和函数内部没有关系
        我们前面学习指针概念>>>>>>复习
        int a 10; 升起一个四个字节的空间
        int * pa = =&a pa就是一个指针变量
        pa要找到a *pa就是a
        *pa = 20 a就是20;
        我们把a和b的地址,类型就匹配上了
        pa和pb未来是可以找到a和b的
        这样我们把swap函数的内部与外部的调用去进行联系
        ​*pa访问的就是a
        ​通过远程的pa与pb进行调用
        仔细看: 指针变量的大小的固定的
        我们把a和b的指针放入pa和pb
        有朝一日我们就拿到这两个地址进行a和b的调用
        这就是指针的作用
        注意有void不要有return x;除非return;
        什么情况我们传地址过去
        函数内部和函数外部要进行联系
      • 函数的参数

        • 实参


          .int max = get_max(2+5,3);
          确定的值2+5等于7,我们确定把7传给函数定义的形参
        • 形参


          但函数只定义,没有调用使用,没有分配内存单元
          不用为参数分配空间,就是个摆设,形参
          只有在调用时才分配空间
          出来的时候x和y销毁
          形参的生命周期和局部变量一样
          swap1在被调用的时候,实参穿给形参
          其实形参是实参的一份拷贝
          改变形参,不会改变实参
          swap2之间的形参和实参有联系
      • 函数的调用

        • 传值调用
          把变量本身传过去了
        • 传址调用
          进行了取地址
          可以让函数和函数外部的变量建立起真的联系
        • 练习1.写一个数,判断他是不是素数,打印100到200之间的素数


          关键是判断i是不是素数
          我们要创立一个函数去判定函数名是is_prime
          is_prime(int n);
          函数功能要单一
        • 练习2.写一个函数判断一年是不是闰年


          for循环
          is_leap_year函数名
          还有返回类型int
          测试通过了,但不规范
          一个函数如果不写返回类型,默认返回int类型
          void也是类型,空类型,不需要返回
        • 练习3.实现一个整形数组的二分查找


          函数名:binary_search
          找到了就返回找到位置的下标
          找不到就返回-1;因为下标不可以为-1,下标从0开始
          参数几个?三个!数组的元素
          返回下标
          形参和实参名字可相同可不相同
          12345678910下标分别是0和9
          二分查找
          int left =0
          int right = s -1;就得到0和9
          a[mid]中间元素
          a[mid> k]
          要多次二分查找用while循环
          arr[]什么也不是
          形参是这样写的int a[]
          只是告诉我们这是一个数组
          数组arr传参,实际上传递的不是数组本身
          仅仅传过去了数组首元素的地址
          int a[] 就是一个指针
          整形的地址就是一个指针
          本质上是指针
          所以sizeof[a]就是四
          sizeof(a[0])就是四
          四除以四就是一
          所以算数组元素个数要在main函数执行
          一定要先求好,不要在函数内部求
    • 第四题,每调用一次函数,就会将num的值增加一


      Add函数
      int num = 0;
      Add函数每次调用num就会增加一;
      注意add函数想改变我们的num,那我们只能把num的地址传过去,否则函数内部如何改变函数外部的量;
      所以一定把地址传过去Add(&num);
      void Add(int*p){
      (*p)++;
      ​}
  • 函数的嵌套调用和链式访问


    我们不能对函数进行嵌套定义
    每一个函数都要在大括号内独立存在,函数之间是平等的

    • 但函数可以嵌套调用


      就是在main函数和test函数进行调用
      ​你调用她,她调用你,互相调用
    • 链式访问


      解释:假设求字符串的长度
      两个例子
      最后一个为什么?
      printf返回值类型是int,并且函数返回的是是打印在屏幕上的字符的个数

      先在屏幕上打印出43,然后43个两位数,打印2

      2是一位数,在屏幕上打印1
      答案是4321
  • 函数的声明和定义

    • 函数的声明和定义


      编译器是从前往后扫描
      在使用之前先告知
      先声明后使用
      后面写代码都是分模块去写的
      写一个计算机
      程序员A B C加法交给A 乘法交个B
      加法写了add.h 和add.c
      总管来集成
      每个人写自己的代码,函数声明放在头文件
      各司其职

      定义放在.c文件中

      假设程序员E不会写加减乘除,买个别人的
      卖给被人,不给他源码
      保密,配置类型>>静态库
      sub.lib就是静态库文件
      静态库都是乱码
      把静态库和.h文件卖给程序员E
      卖给人家,得告诉人家怎么用,建立现有项的sub.h文件以后
      不能跑起来
      要导入静态库
      #pragma comment(lib,"sub.lib")
      为什么就跑起来了呢
      当我们把一个代码的声明与实现分别放在.h和静态库文件时,就隐藏了

      函数的定义是交代函数的功能实现和函数的具体实现
    • 对以后的内容的延伸,三子棋和扫雷


      还有应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值