当前课程知识点:数据结构 >  第0章 预备知识 >  0.2 函数 >  0.2 函数

返回《数据结构》慕课在线视频课程列表

0.2 函数在线视频

下一节:0.3 指针和单链表

返回《数据结构》慕课在线视频列表

0.2 函数课程教案、知识点、字幕

同学们,大家好

我是云南大学信息学院的教师孔兵

c语言程序是由函数组成的

当我们需要完成某一相对独立的功能时候

就用一个函数去实现它

我们先看一下函数的定义

函数定义包括这样几个部分

一是函数的返回值类型

定义return返回值的类型

然后一个是函数名

new_style

我们通过函数名来调用这个函数

然后是形式参数

一般是给出函数中要处理的数据对象

这里声明了a和x两个形式参数

随后是函数体

函数体中一般描述局部变量和完成对应功能的程序段

在函数调用的时候

有实参和形参的匹配问题

下面我们 重点讨论一下这个问题

函数实参和形参的匹配一般是所谓的传值的方式

以调用上述定义的函数为例

主函数中对new style的调用

实在参数是a1和x1

以实参a1和形参a为例

传值调用是这样实现的

在调用开始的时候首先为形式参数a分配存储空间

这句话背后的意思是说

形式参数在调用之前

实际上并没有存储空间

不具备变量最根本的特征

调用开始的时候才为它分配存储空间

它也才具有了一个变量的最基本的特征

随后,把实在参数a1的内容

拷贝一个副本到a分配的这个空间中去

以这样的方式完成实参和形参的匹配

在函数执行的过程当中

a的内容可能会产生变化

但是,我们注意到

他的变化对实参a1没有任何影响

它是在另外一块存储空间当中产生的变化

调用结束以后,形参a的空间会被释放

也就是说形式参数的生命是有周期的

从函数调用开始分配空间

到函数调用结束的时候它被释放

通过上述讨论

我们注意到

形参的内容

在函数执行的过程中可能发生变化

但对实参本身没有任何影响

因为它们是不同的存储空间

除了调用开始时的拷贝,没有什么关联

下面介绍引用

引用呢是C++语言扩充的一种派生数据类型

我们先看例子

在这个例子当中我们首先声明了一个整型变量age

随后,我们又声明了一个整型的引用age-alias

我们注意到age-alias前面有个符号

在这里,这不是取地址的意思

它是声明引用的

作用类似于声明指针时候的*

那么引用的作用是什么呢

引用的作用是为对象取一个别名

声明一个引用类型的变量之后

该变量必须由一个已经声明的变量来进行初始化

初始化以后

该引用变量就和已经声明的变量联系起来了

成为了已声明变量的别名

从例子中我们看到

整型引用变量age-alias

由一个已经声明的整型变量age来初始化

这样呢,初始化以后

age-alias就变成了age的一个别名

确定了这样的引用别名以后

那么对别名的操作

等价于对原变量的操作

关于引用,我们可以作这样的理解

前面说到过变量的本质是内存的一块存储空间

那么声明了整形变量age以后

就要为它分配一块长度为4个字节的存储空间

并且把age这个名字和这块空间关联起来

以便于后来我们可以通过age这个名字来存取这块存储空间

如果我们是用age来初始化一个引用变量age-alias

可以理解为这块存储空间实际上又被取了另一个名字

有了一个别名,这个名字就是age-alias

关于操作就容易理解了

不管是对age操作还是对age-alias操作

他们存取的对象都是内存当中同一块存储空间

那么操作的效果肯定是一样的

这样的使用方式有价值吗

一块空间有了一个名字

又给他另外再起一个名字

上述例子当中的使用方式实际上是不会出现的

这样的方式除了引起不必要的混乱

没有任何价值

引用出现在什么地方呢

引用一般是作为函数的形式参数出现的

我们看一个例子, 在主函数中

我们通过键盘输入给整型变量i,j赋值

然后,调用swap函数

顾名思义swap函数的功能是交换

调用它的目的是想把i和j两个变量的内容做一个交换

这个交换能达成吗

这是不能的

前面介绍过,按照传值调用的方式

i和j分别作为实参

分别传递给x和y两个形参

调用开始的时候

形参x和y分配存储空间

把实参i和j的内容拷贝到x和y中

在swap执行的过程中,x和y会发生交换

但是仅仅是x和y两个空间当中的内容进行了交换

函数返回以后,x和y的存储空间被释放了

从上述过程中可以看出

x和y会发生交换的操作但是对i和j两个实参没有任何影响

而我们的目的是要交换i和j

怎么达成这个目标呢

很简单,把形式参数声明为一个引用

这样当发生函数调用的时候

是用实参来初始化引用形参了

也就是说引用形参变成了实参的一个别名

如图所示,按前面我们介绍的本质意义上来说

就是x和 i对应同一块内存空间

y和 j对应同一块内存空间

这样对x和y的交换是这两块存储空间内容的交互

也是i和j的交换,这样就达成了我们的目标

在后续教材的函数定义中

大多数的形式参数被定义为引用

它主要的目的是:当发生函数调用时

如果实参的内容在调用过程中会发生改变

并且这个改变对后续实参的使用有影响

那么可以通过上述的引用传递方式

把对实参的改变保留下来

方便后续使用

后面我们结合例子会再讨论这个方法

好了,同学们

我们今天的课程就到这里,下节课再见

数据结构课程列表:

前言

-1.算法概念导入

--1.1 算法概念导入

-2.数据结构课程介绍

--2.数据结构课程介绍

-数据结构前言PPT

第0章 预备知识

-0.1变量、类型和表达式

--0.1变量、类型和表达式

-0.2 函数

--0.2 函数

-0.3 指针和单链表

--0.3 指针和单链表

-0.4 数组、指向函数的指针

--0.4 数组、指向函数的指针

-第0章 预备知识讨论题

-数据结构第0章预备知识PPT

第1章 绪论

-1.1什么是数据结构

--1.1什么是数据结构

--测试题

-1.2基本概念和术语

--1.2基本概念和术语

--测试题

-1.3数据结构的描述

--1.3数据结构的描述

--测试题

-1.4抽象数据类型的定义和实现

--1.4抽象数据类型的定义和实现

--测试题

-1.5算法和算法分析概念

--1.5算法和算法分析概念

--测试题

-1.6算法分析示例

--1.6算法分析示例

--测试题

-第1章 绪论讨论题

-数据结构第1章 绪论PPT

第2章 线性表

-2.1 线性表的类型定义

--2.1线性表的类型定义

--测试题

-2.2线性表的顺序表示和实现

--2.2 线性表的顺序表示和实现

--测试题

-2.3 线性链表

--2.3 线性链表

--测试题

-2.4 静态链表

--2.4 静态链表

--测试题

-2.5 循环链表和双向链表

--2.5 循环链表和双向链表

--测试题

-第2章 线性表讨论题

-数据结构第2章线性表PPT

第3章 栈和队列

-3.1 栈

--3.1栈

--测试题

-3.2 栈的实现

--3.2 栈的实现

--测试题

-3.3 栈的应用

--3.3 栈的应用

-3.4 栈与递归的实现

--3.4栈与递归的实现

--测试题

-3.5 队列和链队列

--3.5 队列和链队列

--测试题

-3.6 循环队列

--3.6 循环队列

--测试题

-第3章 栈和队列讨论题

-数据结构第3章栈和队列PPT

第4章 串

-4.1 串

--4.1 串

--测试题

-数据结构第4章 串PPT

第5章 数组

-5.1 数组定义和表示

--5.1 数组定义和表示

--测试题

-5.2矩阵的压缩存储

--5.2 矩阵的压缩存储

--测试题

-第5章 数组讨论题

-数据结构第5章数组PPT

第6章 树和二叉树

-6.1 树的定义和基本术语

--6.1 树的定义和基本术语

-6.2 二叉树和二叉树的性质

--6.2 二叉树和二叉树的性质

--测试题

-6.3 二叉树的存储结构

--6.3二叉树的存储结构

--测试题

-6.4 遍历二叉树

--6.4 遍历二叉树(1)

--6.4 遍历二叉树(2)

--测试题

-6.5 线索二叉树

--6.5 线索二叉树

--测试题

-6.6 树的存储

--6.6树的存储

-6.7 树的转换和遍历

--6.7 树的转换和遍历

--测试题

-6.8 赫夫曼树

--6.8 赫夫曼树

-6.9 赫夫曼编码

--6.9 赫夫曼编码

--测试题

-第6章 树和二叉树讨论题

-数据结构第6章树和二叉树PPT

第7章 图

-7.1 图的定义和术语

--7.1.1图的定义和术语(1)

--7.1.2图的定义和术语(2)

--测试题

-7.2 图的存储结构

--7.2.1 数组表示法(1)

--7.2.2 数组表示法(2)

--7.2.3 邻接表

--测试题

-7.3 图的遍历

--7.3.1 深度优先搜索

--7.3.2 广度优先搜索

--测试题

-7.4 最小生成树

--7.4.1 普里姆算法

--7.4.2 克鲁斯卡尔算法

--测试题

-7.5 有向无环图

--7.5.1 拓扑排序

--7.5.2 关键路径

--测试题

-7.6 最短路径

--7.6.1 单源最短路径-迪杰斯特拉算法

--7.6.2 每一对顶点之间的最短路径-弗洛伊德算法

--测试题

-第7章 图讨论题

-数据结构第7章图PPT

第8章 查找

-8.1 查找基本概念和顺序查找

--8.1 查找基本概念及顺序查找

--测试题

-8.2 有序表的查找

--8.2 有序表的查找

--测试题

-8.3 二叉排序树

--8.3.1 二叉排序树(1)

--8.3.2 二叉排序树(2)

--测试题

-8.4 平衡二叉树

--8.4 平衡二叉树

--测试题

-8.5 哈希表

--8.5.1 哈希表及哈希函数的构造

--8.5.2 解决冲突的方法

--8.5.3 哈希表的查找和性能分析

--测试题

-第8章 查找讨论题

-数据结构第8章查找PPT

第9章 内部排序

-9.1插入排序

--9.1.1 插入排序(1)

--9.1.2 插入排序(2)

--测试题

-9.2 希尔排序

--9.2 希尔排序

--测试题

-9.3 快速排序

--9.3 快速排序

--测试题

-9.4 选择排序

--9.4 选择排序

--测试题

-9.5 堆排序

--9.5 堆排序

--测试题

-9.6 归并排序

--9.6 归并排序

--测试题

-9.7 基数排序

--9.7 基数排序

--测试题

-9.8 排序方法总结

--9.8 排序方法总结

-第9章 内部排序讨论题

-数据结构第9章内部排序PPT

0.2 函数笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。