当前课程知识点:C++语言程序设计基础 > 第6章 数组、指针与字符串(一) > 数组作为函数的参数 > 数组作为函数参数(例6-2)
l 数组元素作实参,与单个变量一样。
l 数组名作参数,形、实参数都应是数组名(实质上是地址,关于地址详见6.2),类型要一样,传送的是数组首地址。对形参数组的改变会直接影响到实参数组。
例6-2 使用数组名作为函数参数
主函数中初始化一个二维数组,表示一个矩阵,矩阵,并将每个元素都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。
例6-2 使用数组名作为函数参数
#include <iostream>
using namespace std;
void rowSum(int a[][4], int nRow) {
for (int i = 0; i < nRow; i++) {
for(int j = 1; j < 4; j++)
a[i][0] += a[i][j];
}
}
int main() { //主函数
//定义并初始化数组
int table[3][4] = {{1, 2, 3, 4}, {2, 3, 4, 5}, {3, 4, 5, 6}};
例6-2 使用数组名作为函数参数
//输出数组元素
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++)
cout << table[i][j] << " ";
cout << endl;
}
rowSum(table, 3); //调用子函数,计算各行和
//输出计算结果
for (int i = 0; i < 3; i++)
cout << "Sum of row " << i << " is " << table[i][0] << endl;
return 0;
}
大家好
欢迎回来继续学习
C++语言程序设计
这一节我们来学习
如何用数组作为函数的参数
来传递
如果用数组元素做实参
那就其实跟单个变量是一样的
数组元素没办法又做形参
形参的话你想
都没有办法去定义说
我只要一个数组元素做形参
语法上就没有提供这种可能性
所以大家就不用去考虑这个问题
但是我们可以用数组元素
做实参的
就是需要一个变量的地方
我们都可以给一个数组元素
它跟单个变量作用是一样的
那么更多情况下呢
我们会用数组名来做参数
这个时候语法要求
形参 实参都是数组名
实际上我们稍后在这一章中
学了地址 学了指针
大家就明白了
传递数组名
实际上传的是地址
但是这个是后话
我们现在呢
先按照语法的要求去理解
要求形参 实参都是数组名
类型也要一样
传送的是数组的首地址
那这样的话
由于传送的是地址
所以我们在函数中
如果对形参数组
它的元素进行了改变的话呢
是立刻直接影响到实参数组的
那么这样一个机制呢
有的时候它是有用的
是好的
我们可以用这样的方式呢
带回运算结果
也就是达到双向传递
有的时候呢
又是我们要避免的副作用
大多数时候
我们传数组给函数去处理
并不希望
它把我们原本传过去的这个实参
给修改了
只是希望它能用这里面的数据
参与计算就好
所以这个时候呢
我们就可以传一个常数组过去
下面呢
我们就来看一个
用数组名做参数的例子
这个例题定义了一个函数
专门用来求数组每一行的和
在主函数中
定义并且初始化好了
一个二维数组
把这个数组名作为参数
传给子函数
由子函数去计算每一行的和
那么也就是说
一个比如说三行的数组
它计算出来就有三个结果
怎么样能够带回主函数中
这道题要求将和直接存在
数组的首元素中
那么这样就能带回主函数了吗
我们运行这个程序
看一看效果
我们看到这是这个求
数组各行和的函数
这个函数定义的是
相对比较通用一点
这个它定义的数组形参呢
是有四列
但是行数不确定
也就是说
你调用的时候给的实参
多少行都可以
限制是四列就行
然后由于行数不确定
我们又需要通过循环
一行一行地处理这个数据
所以循环控制变量里面
肯定需要这种行
这个因素来控制循环结束条件
所以我们还要单独将数组的行数
作为一个参数传进来
在主函数中呢
我们这儿定义好了一个数组
我们进到主函数里面看一下
定义并且初始化好
一个数组以后呢
输出这个数组
这个for循环呢
就是输出数组元素
二维数组往往是用两重循环
来处理的
外层是行循环
内层是列循环
这样先行循环
在每一行中
循环处理每一列的元素
这样就把整个二维表格的元素
都输出了
验证一下我们是不是
正确的初始化好了
好 我们就不单步去做循环了
一下把这个
输出这部分运行完
f5到下一个断点的地方
然后我们看输出的内容
确实是正确的
是我们初始化的值
接下来呢
再追踪到函数里面去
我们看到在函数里面
也是一个两重循环
用来处理整个数组的元素
外层是行循环
在每一行中呢
再用一个for循环
去累加这一行的各列的值
累加的和都放在行首元素里面
现在经过整个for循环以后
我们走到下一个断点的位置
也就是rowSum函数结束的位置
形参数组a
它的行首元素全部都被修改了
也就是累加和都放在这儿了
现在再回到主函数
回到主函数以后
这里我们又用一个循环语句
去输出每一行的行首元素
看看跟原来的是不是有区别
我们的累加和是不是带回来了
这样我们把断点
设在程序最后的地方
让它完成这个for循环以后
好 现在程序执行到这儿来
我们看输出这个命令行窗口
的确
刚刚我们在子函数中看到的
计算出的每一行的和
放到行首元素中以后呢
回到主函数中
输出主函数中
table数组的行首元素
是一样的
所以数组实际上
它就是
数组名就是数组的首地址
我们用数组名做实参
就是将主函数中
已经定义好的这个数组
它的首地址传给了
函数rowSum
表面上看起来
形参是一个同结构的数组
实际上
它就是接收了一个首地址
所以呢
在rowSum中我们操作数组a
就相当于
直接操作了主函数里面的
数组table
对于这个数组a的
任何一个细微地修改
实际上是直接作用于主函数中
数组table里面的
所以我们看到
将所有行的和
存在各行的行首元素中以后
回到主函数
主函数中table数组的
每行的行首元素也变化了
变成各行的数据之和了
-导学
--第1章导学
-计算机系统简介
--计算机系统简介
--计算机系统简介 测试题
-计算机语言和程序设计方法的发展
--计算机语言和程序设计方法的发展 测试题
-面向对象的基本概念
--面向对象的基本概念 测试题
-程序的开发过程
--程序的开发过程
--程序的开发过程 测试题
-信息的表示和储存
--计算机的数字系统
--数据的编码表示
--信息的表示和储存 测试题
-实验指导
-导学
--第二章导学
-C++语言概述
--C++语言概述 测试题
-基本数据类型、常量、变量
--程序举例
--基本数据类型、常量、变量 测试题
-运算与表达式
--运算与表达式 测试题
-实验二:简单程序设计(上)
-数据的输入和输出
--数据的输入和输出
--数据的输入和输出 测试题
-选择结构
--if语句
--switch语句
--选择结构 测试题
-循环结构
--for语句
--循环结构 测试题
-自定义类型
--自定义类型
--自定义类型
-第2章小结
--第二章小结
-实验二:C++简单程序设计(下)
-导学
--导学
-函数定义
--函数定义
--函数定义 测试题
-函数调用
--例3-2
--例3-3
--例3-4
--例3-5
--例3-6
--函数调用 测试题
-嵌套与递归
--例3-9
--例3-10
--嵌套与递归 测试题
-函数的参数传递
--函数的参数传递
--函数的参数传递 测试题
-引用类型
--引用类型 测试题
-含有可变参数的函数
--含有可变参数的函数 测试题
-内联函数
--内联函数 测试题
-constexpr函数
--CONSTEXPR函数课后习题
-带默认参数值的函数
--带默认参数值的函数 测试题
-函数重载
--函数重载 测试题
-C++系统函数
--C++系统函数习题
-第3章小结
--第三章小结
-实验三(上)函数的应用
-实验三(下)函数的应用
-导学
--导学
-面向对象程序的基本特点
--面向对象程序的基本特点 测试题
-类和对象
--类和对象的定义
--类和对象 测试题
-构造函数
--构造函数基本概念
--委托构造函数
--复制构造函数
--构造函数 测试题
-析构函数
--析构函数
--析构函数 测试题
-类的组合
--类的组合
--类的组合程序举例
--前向引用声明
--类的组合 测试题
-UML简介
--UML简介
--UML简介课后习题
-结构体与联合体
--结构体与联合体 测试题
-枚举类
--枚举类
--枚举类 测试题
-第4章小结
--第四章小结
-实验四(上)
--实验四(上)
-实验四(下)
--实验四(下)
-导学
--导学
-标识符的作用域与可见性
--标识符的作用域与可见性 测试题
-对象的生存期
--对象的生存期
--对象的生存期 测试题
-类的静态成员
--类的静态成员 测试题
-类的友元
--类的友元 测试题
-共享数据的保护
--共享数据的保护 测试题
-多文件结构和预编译命令
--多文件结构和预编译命令 测试题
-第5章小结
--小结
-实验五
--实验五
-导学
--导学
-数组的定义与初始化
--数组的定义与使用
--一维数组应用举例
--数组的定义与初始化 测试题
-数组作为函数的参数
--数组作为函数的参数 测试题
-对象数组
--对象数组
--对象数组 测试题
-基于范围的for循环
-指针的定义和运算
--指针的定义和运算 测试题
-综合实例
--综合实例
-实验六(上)
--实验六上
-指针与数组
--指针数组
--指针与数组 测试题
-指针与函数
--指针类型的函数
--指向函数的指针
--指针与函数 测试题
-对象指针
--对象指针
--对象指针 测试题
-动态内存分配
--动态内存分配 测试题
-智能指针
--智能指针
-vector对象
--vector对象
--vector对象 测试题
-对象复制与移动
--移动构造
--对象复制与移动 测试题
-字符串
--C风格字符串
--string类
--字符串 测试题
-第6章小结
--第六章小结
-综合实例
--综合实例
-实验六(下)
--实验六(下)