当前课程知识点:C语言程序设计 >  第8章 函数 >  8.3 函数参数的传递方式 >  函数参数的传递形式

返回《C语言程序设计》慕课在线视频课程列表

函数参数的传递形式在线视频

下一节:变量的作用域和生存期

返回《C语言程序设计》慕课在线视频列表

函数参数的传递形式课程教案、知识点、字幕

同学们

大家好

今天我们来讲函数参数的传递方式

函数参数的传递方式

根据实参传递给形参值的不同

通常有值传递方式和地址传递方式两种

下面看第一种方式

值传递方式

这种方式在函数调用时

为形参分配单元

并将实参的值复制到形参中

调用结束

形参单元将被释放

实参单元仍保留并维持原值

其特点是

第一

形参与实参占用不同的内存单元

也就是说它们互不影响

第二

单向传递

也就是说

值只会从实参向形参传递

而不会从形参向实参传递

对形参的修改

这种修改不会反向传递给实参

从而不影响实参的值

下面举例说明

例如

这个程序中定义的swap函数

试图做到交换两个数

main函数中调用swap函数试图交换x和y的值

但我们看到运行结果

函数调用前后

x 和 y的值并没有交换

x依然等于7

y依然等于11

这是为什么呢

就是因为实参向形参的参数传递是单向传递的

从swap函数代码可以看到

它完成了对形参变量a和b的交换

但这种交换不会影响实参x和y的值

所以x和y的值

在函数调用结束后仍然是它的原始值

7和11

这就是值传递的特点

下面来看地址传递方式

这种方式

在函数调用时

是将数据的存储地址

作为参数传递给形参

例如

数组类型作为函数参数或

第9章将要讲的指针作为函数参数时

将使用这种传递方式

这种方式有这么一些特点

第一

形参与实参占用同样的存储单元

第二

双向传递

也就意味着

对形参例如对数组元素的修改

也将会对实参数组做同样的修改

第三

实参和形参必须是地址常量或变量

例如数组名就是常用的地址常量

用数组名作为函数参数时还应注意以下几点

第一

形参数组和实参数组的类型必须一致

否则将引起错误

第二

形参数组和实参数组的长度可以不相同

因为在调用时

只传送首地址而不检查形参数组的长度

第三

多维数组也可以作为函数的参数

在函数定义时对形参数组可以指定

每一维的长度

也可省去第一维的长度

例如

这个例子中的mergestr函数

以数组名作为函数参数

实现了将

任意两个字符串连接成一个字符串的功能

mergestr函数的参数为3个字符数组

s1 s2 s3

也就是3个字符串

这里我们省略了形参数组的长度

也就是方括号里面留空

通过代码可以看到

该函数首先通过for循环

将字符串s1中的所有字符复制到了s3数组中

但不包括\0

又将s2中的所有字符追加在了后面

最后加上了字符串结束标志\0

这样就完成了将字符串s1

和s2合并到字符数组s3中的目的

而main函数中定义了字符数组str1

和str2

内容分别是hello和china两个字符串

同时又定义了合并

所有存入的字符数组str3

然后以这3个字符数组名做为参数

调用了mergestr函数

最后输出str3的内容

那么在调用mergestr函数的时候

数组s1和str1拥有相同的内存地址

s2和str2拥有相同的内存地址

s3 和str3拥有相同的内存地址

所以

在函数中

对s3的操作

也就是复制字符到s3数组中

也就是对数组str3的操作

也就是复制字符到str3数组中

可以认为它们是同一个数组

或者说形参数组和实参数组是合体的

所以

最后的结果就是

将str1和str2中的字符

合并到了str3数组中然后输出

运行结果就是合并后的字符串

Hello China

这里需要特别注意的是

形参与实参的写法

形参数组必须要有方括号

如s1[ ]

逗号s2[ ]等

而调用函数时

实参不加[ ]

只写数组名即可

如str1

str2

str3

这就是地址传递方式

同学们

今天的内容就讲到这里

我们下次再见

C语言程序设计课程列表:

第1章 C语言程序设计预备知识

-计算思维与计算机

--计算思维与计算机

--计算思维与计算机

--计算思维和计算机

第2章 C语言程序设计基础

-2.1 程序设计语言的发展及其特点和应用

--程序设计语言的发展及其特点和应用

--程序设计语言的特点及发展

- 2.2 C语言程序的基本结构及编制C语言程序的基本步骤

-- C语言程序的基本结构及编制C语言程序的基本步骤

--C语言程序的结构和编制步骤

第3章 基本数据类型、运算符与表达式

-3.1 C语言的数据类型

--C语言的数据类型

--C语言的数据类型

-3.2 常量

--常量

--常量

-3.3 什么是变量

--什么是变量

--什么是变量

-3.4 如何进行算术运算

--如何进行算术运算

--如何进行算术运算

-3.5 赋值运算符和逗号运算符

--赋值运算符和逗号运算符

--赋值运算符和逗号运算符

-3.6 数据类型转换

--数据类型转换

--数据类型转换

第4章 基本输入输出和顺序程序设计

-4.1 格式化输出printf

--格式化输出printf

--格式化输出

-4.2 格式化输入scanf及字符数据的非格式化输入输出

--格式化输入scanf及字符数据的非格式化输入输出

--格式化输入

第5章 选择结构程序设计

-5.1 关系运算符和关系表达式

--关系运算符和关系表达式

--关系运算符和关系表达式

-5.2 逻辑运算符和逻辑表达式

--逻辑运算符和逻辑表达式

--逻辑运算符和逻辑表达式

-5.3 条件运算符和条件表达式

--条件运算符和条件表达式

--条件运算符和条件表达式

-5.4 if语句

--if语句

--if语句

-5.5 switch语句

--switch语句

--switch语句

第6章 循环结构程序设计

-6.1 while语句

--while语句

--while语句

--do-while语句

-6.2 for语句

--for语句

--for语句

-6.3 循环的嵌套

--循环的嵌套

--循环的嵌套

-6.4 break语句和continue语句

--break语句和continue语句

--break和continue语句

第7章 数组

-7.1 一维数组的定义和引用

--一维数组的定义和引用

--一维数组的定义和引用

-7.2 一维数组的赋值

--一维数组的赋值

--一维数组的赋值

-7.3 二维数组的定义和引用

--二维数组的定义和引用

--二维数组的定义和引用

-7.4 二维数组的赋值

--二维数组的赋值

--二维数组的赋值

-7.5 字符串的本质

--字符串的本质

--字符串的本质

-7.6 字符串操作的常用函数

--字符串操作的常用函数

--字符串常用函数

-7.7 字符串数组

--字符串数组

--字符串数组

第8章 函数

-8.1 函数概述

--函数概述

--函数概述

-8.2 有参函数

--有参函数

--有参函数

-8.3 函数参数的传递方式

--函数参数的传递形式

--函数参数的传递方式

-8.4 变量的作用域和生存期

--变量的作用域和生存期

--变量的作用域和生存期

-8.5 变量的存储类型

--变量的存储类型

--变量的存储类型

-8.6 函数的嵌套和递归调用

--函数的嵌套和递归调用

--函数的嵌套和递归调用

-8.7 函数的作用域与封装

--函数的作用域与封装

--函数的作用域与封装

第9章 指针

-9.1 指针变量的概念(上)

--指针变量的概念(上)

--指针变量的概念(上)

-9.2 指针变量的概念(下)

--指针变量的概念(下)

--指针变量的概念(下)

-9.3 指向一维数组的指针变量

--指向一维数组的指针变量

--指向一维数组的指针变量

-9.4 指向二维数组的指针变量(上)

--指向二维数组的指针变量

--指向二维数组的指针变量(上)

-9.5 指向二维数组的指针变量(下)

--指向二维数组的指针变量(下)

--指向二维数组的指针变量(下)

-9.6 动态内存分配

--动态内存分配

--动态内存分配

第10章 预处理命令

-10.1 编译预处理

--编译预处理

第11章 复杂数据类型

-11.1 用户自己建立数据类型

--用户自己建立数据类型

--用户自己建立数据类型

-11.2 定义结构体类型变量

--定义结构体类型变量

--定义结构体类型变量

-11.3 结构体变量的引用与初始化

--结构体变量的引用与初始化

-11.4 结构体数组

--结构体数组

--结构体数组

-11.5 指向结构体类型数据的指针

--指向结构体类型数据的指针

--指向结构体类型数据的指针

第12章 文件

-12.1 文件的基本概念和文件指针

--文件的基本概念和文件指针

--文件的基本概念和文件指针

-12,2 文件的打开和关闭

--文件的打开和关闭

--文件的打开和关闭

-12.3 文本文件读写

--文本文件读写

--文本文件读写

-12.4 二进制文件读写

--二进制文件读写

--二进制文件读写

函数参数的传递形式笔记与讨论

也许你还感兴趣的课程:

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