函数

  • 函数是一组一起执行任务的语句,函数是一个可执行C程序必不可少的条件(至少一个main()函数),函数的定义形式

    returnType functionName() {
    bodyOf of the function
    }
  • 定义函数的意义

    • 为某个经常使用的功能定义一个函数,可以提高代码的简洁性
    • 封装函数功能的实现细节,提供一个可用的接口
    • 可以构建函数库,使软件开发变得更加高效
  • 函数的组成部分

    • 返回类型

      • 函数返回值的默认类型为int,若没有返回值,则返回类型为:void
      • 标准函数库中的常见函数返回值的含义】
        • main 函数的返回值为函数结束的状态
        • printf 函数的返回值为字符常量的字符个数
      • 返回值的注意事项
        • 一个函数最多能返回一个值(swift语言中使用元组实现了多返回值方案)
        • 若指定了返回值得类型,却未返回任何值,此时函数的返回值为一个未知的数
    • 函数名称
      • 函数调用时使用的实际名称
      • 函数签名
        • 函数名与参数列表共同构成了函数签名
    • 参数
      • 为函数调用时的实际参数占位,函数可能不包含参数
      • 参数的类型
        • 形参

          • 形参的作用域仅限于该函数,在进入函数时被创建,退出函数时被销毁
          • 不能在函数内部定义与形参同名的变量,否则会将形参覆盖
        • 实参
          • 实参的个数必须与形参的个数相同
          • 实参的类型必须与形参的类型一致,否则将造成数据失真
      • 参数列表
        • 包含参数的类型、顺序、数量
      • 函数参数的传递方式
        • 值传递

          • 将参数的实际值复制给形式参数,对实际参数没有影响
        • 地址传递
          • 将参数的地址复制给形式参数,对实际参数有影响
        • 引用传递
          • 将参数的引用复制给形式参数,对实际参数有影响
    • 函数主体
      • 函数执行的一系列语句
  • 函数的声明

    • 为编译器提供函数的相关信息,在编译时只会被拷贝一次,可以重复声明
    • 注意
      • 函数在使用之前需要先定义或声明
      • 每个声明的函数必须定义,否则链接时会报错
      • 函数声明一般写在.h文件中,在使用时,用#include包含该文件
      • 函数声明时,若有参数,参数列表是必须的,参数名不是必须的,即函数声明时可以没有参数名
  • 函数的注意事项

    • 不能定义同名函数
    • 函数一般具有文件作用域,不允许嵌套定义
    • 函数的嵌套调用要遵循堆栈规则
    • 调用未定义和声明的函数,编译器只会发出警告
    • 有时候需要写一个空函数,以便在后期的开发中实现相应的功能
  • 函数的执行过程

    • 调用函数,操作系统为函数分配一定空间的内存
    • 在函数的内存空间定义形参,并将实参的值赋值给形参
    • 对形参进行操作,完成指定功能
    • 函数返回,操作系统撤销为函数分配的内存
  • 示例

    #include <stdio.h>
    // 值传递
    void swap1(int a, int b);
    // 指针传递
    void swap2(int *a, int *b);
    // 引用传递
    void swap3(int &a, int &b);
    int main()
    {
    // 定义两个变量用于交换
    int a = 10;
    int b = 20;
    // 值传递,不会改变a,b的值
    swap1(a, b);
    printf("a=%d, b=%d\n", a, b);
    // 指针传递,会改变a,b的值
    swap2(&a, &b);
    printf("a=%d, b=%d\n", a, b);
    // 引用传递,会改变a,b的值
    swap3(a, b);
    printf("a=%d, b=%d\n", a, b);
    return 0;
    }
    // 值传递
    void swap1(int a, int b)
    {
    //定义中间变量
    int temp;
    temp = a;
    a = b;
    b = temp;
    }
    //指针传递
    void swap2(int *a, int *b)
    {
    //定义中间变量
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
    }
    void swap3(int &a, int &b)
    {
    //定义中间变量
    int temp;
    temp = a;
    a = b;
    b = temp;
    }

递归函数

  • 递归函数注意事项

    • 递归是函数反复调用自己
    • 每个递归函数都必须有一个出口,一般通过改变参数来实现
    • 符合堆栈规则,一般都可以使用递归
    • 由于递归需要保持大量的中间数据,所以开销较大
  • 迭代与递归的差别
    • 迭代常常可以弥补递归开销较大的缺陷
    • 迭代可以实现递归,反之不然
    • 当递归带来的其他所有方面的好处足以弥补它开销大的缺陷时才使用递归,否则使用迭代

C语言-04-函数的更多相关文章

  1. C语言-04函数

    1.参数 参数注意点 1.形式参数:定义函数时函数名后面中的参数,简称形参 2.实际参数:调用函数式传入的具体数据,简称实参 3.实参个数必须等于形参个数 4.函数体内部不能定义和形参一样的变量 5. ...

  2. Android C语言_init函数和constructor属性及.init/.init_array节探索

    本篇文章主要介绍了"Android C语言_init函数和constructor属性及.init/.init_array节探索",主要涉及到Android C语言_init函数和c ...

  3. C语言pow函数编写

    C语言pow函数编写 #include<stdio.h> double chaoba(double f,double q); //声明自定义函数 void main(void) { dou ...

  4. C语言-自定义函数

    C语言自定义函数 --1-- 自定义函数定义 1.1 无参无返回值函数 1.2 无参有返回值函数 1.3 有参无返回值函数 1.4 有参有返回值函数 --2-- 函数的参数 2.1 形式参数介绍和使用 ...

  5. C语言printf()函数:格式化输出函数

    C语言printf()函数:格式化输出函数 头文件:#include <stdio.h> printf()函数是最常用的格式化输出函数,其原型为:     int printf( char ...

  6. C语言的函数

    "函数"在英文的翻译是"function",无论在自然科学还是计算机科学都是这个词,而"function"的本意是"功能" ...

  7. c语言main函数返回值、参数详解(返回值是必须的,0表示正常退出)

    C语言Main函数返回值 main函数的返回值,用于说明程序的退出状态.如果返回0,则代表程序正常退出:返回其它数字的含义则由系统决定.通常,返回非零代表程序异常退出. 很多人甚至市面上的一些书籍,都 ...

  8. Go语言示例-函数返回多个值

    Go语言中函数可以返回多个值,这和其它编程语言有很大的不同.对于有其它语言编程经验的人来说,最大的障碍不是学习这个特性,而是很难想到去使用这个特性. 简单如交换两个数值的例子: package mai ...

  9. 【学习笔记】【C语言】函数

    一. 什么是函数 任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”.所以,你可以说C语言程序是由函数构成的. 比如你用C语言编写了一 ...

  10. 【转载】 c语言inline函数的使用

    c语言inline函数的使用 转载自:http://blog.chinaunix.net/uid-21843265-id-3056446.html 大学在教科书上学习过inline函数,定义为inli ...

随机推荐

  1. Android View中的控件和监听方法...

    PS:居然三天没写博客了...今天补上...东西虽多,但是都是一些基础...代码多了一些,有人可能会这样问,粘这么多代码有毛用..其实对于一个Android的初学者来说,一个完整的代码是最容易帮助理解 ...

  2. Configuring Service Broker for Asynchronous Processing

    Configuring Service Broker for Asynchronous Processing --create a database and enable the database f ...

  3. python编码问题的最终分析

    python初学者,往往因为字符编码的问题而苦恼不已,本人也是阅读了大量的博客,再进行了一定的测试,基本搞清楚了编码问题的前因后果.下面一段代码是在python3.5上的,以它为例进行讲解(请忽略糟糕 ...

  4. JavaScript 面向对象继承详解

    题记 由于js不像java那样是完全面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现继承,一般都是基于原型链的方式: 一.继承初探 大多数JavaScript的实现用 __proto_ ...

  5. thread_Semaphore信号量

    Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数,并提供了同步机制.  使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数. 一个计数信 ...

  6. Brute Force --- UVA 10167: Birthday Cake

     Problem G. Birthday Cake  Problem's Link:http://uva.onlinejudge.org/index.php?option=com_onlinejudg ...

  7. ASP.NET的简单与面向对象开发

    ASP.NET开发,一开始是为了超赶时间完成任务,只能把功能实现即可.如下面一个功能,在网页中有一个铵钮,用户点一点切换网页的图片,再点一点又切换回来.我们要怎样做?在铵钮事件中去变更图片的路径即可. ...

  8. 在GridView列表中使用图片显示记录是否包含附件

    在我的前面很多文章中,都介绍过通用附件模块的管理,本篇随笔主要介绍在一些应用模块中的列表展示中,包含附件的记录,在GridView列表界面中使用图标来快速显示是否有附件的情况. 1.通用附件模块的应用 ...

  9. 关于c++数的进制的经验

    默认状态下,数据按十进制输入输出.如果要求按八进制或十六进制输入输出,在cin或cout中必须指明相应的数据形式,oct为八进制,hex为十六进制,dec为十进制. 注意: 1.使用不带.h的头文件& ...

  10. [CLR via C#]12. 泛型

    泛型(generic)是CLR和编程语言提供一种特殊机制,它支持另一种形式的代码重用,即"算法重用". 简单地说,开发人员先定义好一个算法,比如排序.搜索.交换等.但是定义算法的开 ...