计算机考研复试之C语言(第七章)

7.1 函数的作用

  • 1、概述
    函数是指功能。每一个函数用来实现一个特定的功能,函数的名字反映其代表的功能。如下图是一个程序中函数调用的示意图。
    在这里插入图片描述

  • 2、函数分类

    • (1)从用户使用的角度划分

    ①库函数
    库函数是由系统提供的,用户不必自己定义,可直接使用它们。
    ②用户自己定义的函数

    • (2)函数形式的划分

    ①无参函数
    在调用无参函数时,主调函数不向被调用函数传递数据。
    ②有参函数
    主调函数在调用被调用函数时,通过参数向被调用函数传递数据。

7.2 定义函数

  • 1、原因

    • (1)概述
      C语言要求,在程序中用到的所有函数,必须“先定义,后使用”。
    • (2)主要内容
      ①指定函数的名字;
      ②指定函数的类型,即函数返回值的类型;
      ③指定函数的参数的名字和类型;
      ④指定函数的功能。
    • (3)库函数

    对于C编译系统提供的库函数,只需用#include指令把有关的头文件包含到本文件模块中即可。

  • 2、定义方法

    • (1)定义无参函数
    类型名  函数名(){
    
      }
    

    对于有返回值的函数,必须要有相应的返回值(通常是用return 语句进行返回)

    • (2)定义有参函数
    类型名	函数名(形式参数表列) 
    {		
        函数体
     }
    
    • (3)定义空函数

    在程序设计中有时会用到空函数,它的形式为

    类型名  函数名()
    { }
    

7.3 调用函数

  • 1、函数调用的形式
    • (1)一般形式
      函数名(实参列表);
      若有参数,则用逗号隔开;若无参数,则括号中为空。
    • (2)函数调用方式
      ①函数调用语句
      把函数调用单独作为一个语句。
      ②函数表达式
      函数调用出现在另一个表达式中,这时要求函数带会一个确定的值以参加表达式的运算。
      ③函数参数
      参数调用作为另一个函数调用的实参。
  • 2、函数调用时的数据传递
    定义函数时括号中的参数为形参,调用该括号中的参数为实参,在调用函数过程中发生的实参与形参间的数据传递,常称为“虚实结合”。实参向形参的数据传递是“值传递”,单向传递,只能由实参传给形参,而不能由形参传给实参。
  • 3、函数调用的过程
    在这里插入图片描述
  • 4、函数的返回值
    return语句的返回值类型必须和所定义的函数值类型相同,若无返回值则定义函数为void类型。

7.4 对被调用函数的声明和函数原型

在一个函数中调用另外一个函数(即被调用函数)需要具备如下条件:
(1)首先被调用的函数必须是已经定义的函数。
(2)如果使用库函数,应该在本文件开头用#include指令进行调用。
(3)如果被调函数在主调函数之后,则应进行生命,函数原型格式如下:
类型名 函数名(形参类型1,形参类型2,…);
说明:
如果已在文件的开头(在所有函数之前),已对本文件中所调用的函数进行了生命,则在各函数中不必对其所调用的函数再作生命。写在所有函数前面的外部生命在整个文件范围中有效。

7.5 函数的嵌套调用

嵌套即在调用一个函数的过程中,又调用另一个函数,如下图所示:
在这里插入图片描述

7.6 函数的递归调用

  • 1、定义
    在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。

  • 2、分类

    • (1)直接调用本函数
      在定义函数f的过程中,又要调用f函数,这是直接调用本函数,如下图所示:
      在这里插入图片描述
    • (2)间接调用本函数
      如果在调用f1函数过程中要调用f2函数,而在调用f2函数过程中又要调用f1函数,这是间接调用本函数,如下图所示:
      在这里插入图片描述

说明:为了防止出现无终止地调用,应该用相关的控制语句(如if)来终止自身调用。

7.7 数组作为函数参数

  • 1、数组元素作为函数实参
    数组元素可以用作函数实参,不能用作形参。在用数组元素作函数实参时,把实参的值传给形参,是“值传递方式”。数据传递的方向是从实参传到形参,单向传递。
  • 2、数组名作函数参数
    用数组名既可以做形参也可以做实参,当用数组名作函数实参时,向形参(数组名或指针变量)传递的是数组首元素的地址。
  • 3、多维数组名作函数参数
    可以用多维数组名作为函数的实参和形参,在被调用函数中对形参数组定义时可以指定每一维的大小,也可以省略第一维的大小说明。

7.8 局部变量和全局变量

  • 1、局部变量
    • (1)定义
      局部变量是指在程序中只在特定过程或函数中可以访问的变量。
    • (2)定义位置
      ①在函数的开头定义;
      ②在函数内的复合语句内定义;
      ③在函数的外部定义;
    • (3)作用范围
      ①只在所定义的函数中有效;
      ②不同函数可以使用相同变量名;
      ③形式参数只能在本函数内使用;
      ④在复合语句中的变量作用仅限于该语句。
  • 2、全局变量
    • (1)概述
      在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。一般全局变量名的第一个字母用大写表示。
    • (2)作用
      设置全局变量增加了函数之间数据联系的渠道。由于同一文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能影响到其他函数中全局变量的值。

7.9 变量的存储方式和生存周期

  • 1、变量的存储位置
    变量按存储位置划分有:
    在这里插入图片描述
  • 2、变量的生存期
    变量按生存期划分有:
    在这里插入图片描述
    一般地所有全局变量以及静态的局部变量存放在静态存储区中。
  • 3、变量的作用域
    变量按作用域划分有:
    在这里插入图片描述
  • 4、关于作用域和生存期的概念,如下表是变量的作用域和和生存期。
    在这里插入图片描述

7.10 关于变量的声明和定义

一般为了叙述方便,把建立存储空间的声明称定义,而把不需要建立存储空间的声明称为声明。显然这里指的声明是狭义的,即非定义性声明。例如:

int	main() {
		extern	A;	//是声明,不是定义。
		           //声明将已定义的外部变量A的作用域扩展到此				…		
		return	0; 
		}
 int A;	//是定义,定义A为整型外部变量

7.11 内部函数和外部函数

  • 1、内部函数
    如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加static,即:
    static 类型名 函数名(形参表);
    内部函数又称静态函数,因为它是用static声明的。使用内部函数,可以使函数的作用域只局限于所在文件。
  • 2、外部函数
    • (1)定义
      如果在定义函数时,在函数首部的最左端加关键字extern,则此函数是外部函数,可供其他文件调用。C语言规定,如果在定义函数时省略extern,则默认为外部函数
    • (2)调用
      在需要调用此函数的其他文件中,需要对此函数作声明。在对此函数作声明时,要加关键字extern,表示该函数“是在其他文件中定义的外部函数”。
原创文章 60 获赞 56 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_40605573/article/details/105973321