当前课程知识点:C语言程序设计 > 第8章 函数 > 8.3 函数参数的传递方式 > 函数参数的传递形式
同学们
大家好
今天我们来讲函数参数的传递方式
函数参数的传递方式
根据实参传递给形参值的不同
通常有值传递方式和地址传递方式两种
下面看第一种方式
值传递方式
这种方式在函数调用时
为形参分配单元
并将实参的值复制到形参中
调用结束
形参单元将被释放
实参单元仍保留并维持原值
其特点是
第一
形参与实参占用不同的内存单元
也就是说它们互不影响
第二
单向传递
也就是说
值只会从实参向形参传递
而不会从形参向实参传递
对形参的修改
这种修改不会反向传递给实参
从而不影响实参的值
下面举例说明
例如
这个程序中定义的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
这就是地址传递方式
好
同学们
今天的内容就讲到这里
我们下次再见
-计算思维与计算机
--计算思维与计算机
--计算思维与计算机
--计算思维和计算机
-2.1 程序设计语言的发展及其特点和应用
--程序设计语言的特点及发展
- 2.2 C语言程序的基本结构及编制C语言程序的基本步骤
--C语言程序的结构和编制步骤
-3.1 C语言的数据类型
--C语言的数据类型
--C语言的数据类型
-3.2 常量
--常量
--常量
-3.3 什么是变量
--什么是变量
--什么是变量
-3.4 如何进行算术运算
--如何进行算术运算
--如何进行算术运算
-3.5 赋值运算符和逗号运算符
--赋值运算符和逗号运算符
-3.6 数据类型转换
--数据类型转换
--数据类型转换
-4.1 格式化输出printf
--格式化输出
-4.2 格式化输入scanf及字符数据的非格式化输入输出
--格式化输入
-5.1 关系运算符和关系表达式
--关系运算符和关系表达式
-5.2 逻辑运算符和逻辑表达式
--逻辑运算符和逻辑表达式
-5.3 条件运算符和条件表达式
--条件运算符和条件表达式
-5.4 if语句
--if语句
--if语句
-5.5 switch语句
--switch语句
--switch语句
-6.1 while语句
--while语句
--while语句
--do-while语句
-6.2 for语句
--for语句
--for语句
-6.3 循环的嵌套
--循环的嵌套
--循环的嵌套
-6.4 break语句和continue语句
--break和continue语句
-7.1 一维数组的定义和引用
--一维数组的定义和引用
-7.2 一维数组的赋值
--一维数组的赋值
--一维数组的赋值
-7.3 二维数组的定义和引用
--二维数组的定义和引用
-7.4 二维数组的赋值
--二维数组的赋值
--二维数组的赋值
-7.5 字符串的本质
--字符串的本质
--字符串的本质
-7.6 字符串操作的常用函数
--字符串常用函数
-7.7 字符串数组
--字符串数组
--字符串数组
-8.1 函数概述
--函数概述
--函数概述
-8.2 有参函数
--有参函数
--有参函数
-8.3 函数参数的传递方式
--函数参数的传递方式
-8.4 变量的作用域和生存期
--变量的作用域和生存期
-8.5 变量的存储类型
--变量的存储类型
--变量的存储类型
-8.6 函数的嵌套和递归调用
--函数的嵌套和递归调用
-8.7 函数的作用域与封装
--函数的作用域与封装
-9.1 指针变量的概念(上)
--指针变量的概念(上)
-9.2 指针变量的概念(下)
--指针变量的概念(下)
-9.3 指向一维数组的指针变量
--指向一维数组的指针变量
-9.4 指向二维数组的指针变量(上)
--指向二维数组的指针变量(上)
-9.5 指向二维数组的指针变量(下)
--指向二维数组的指针变量(下)
-9.6 动态内存分配
--动态内存分配
--动态内存分配
-10.1 编译预处理
--编译预处理
-11.1 用户自己建立数据类型
--用户自己建立数据类型
-11.2 定义结构体类型变量
--定义结构体类型变量
-11.3 结构体变量的引用与初始化
-11.4 结构体数组
--结构体数组
--结构体数组
-11.5 指向结构体类型数据的指针
--指向结构体类型数据的指针
-12.1 文件的基本概念和文件指针
--文件的基本概念和文件指针
-12,2 文件的打开和关闭
--文件的打开和关闭
--文件的打开和关闭
-12.3 文本文件读写
--文本文件读写
--文本文件读写
-12.4 二进制文件读写
--二进制文件读写
--二进制文件读写