- 内容提要
- 前言
- 第 1 章 预备知识
- 第 2 章 开始学习 C++
- 第 3 章 处理数据
- 第 4 章 复合类型
- 第 5 章 循环和关系表达式
- 第 6 章 分支语句和逻辑运算符
- 第 7 章 函数——C++的编程模块
- 第 8 章 函数探幽
- 第 9 章 内存模型和名称空间
- 第 10 章 对象和类
- 第 11 章 使用类
- 第 12 章 类和动态内存分配
- 第 13 章 类继承
- 第 14 章 C++中的代码重用
- 第 15 章 友元、异常和其他
- 第 16 章 string 类和标准模板库
- 第 17 章 输入、输出和文件
- 第 18 章 探讨 C++新标准
- 附录 A 计数系统
- 附录 B C++保留字
- 附录 C ASCII 字符集
- 附录 D 运算符优先级
- 附录 E 其他运算符
- 附录 F 模板类 string
- 附录 G 标准模板库方法和函数
- 附录 H 精选读物和网上资源
- 附录 I 转换为 ISO 标准 C++
- 附录 J 复习题答案
7.4 函数和二维数组
为编写将二维数组作为参数的函数,必须牢记,数组名被视为其地址,因此,相应的形参是一个指针,就像一维数组一样。比较难处理的是如何正确地声明指针。例如,假设有下面的代码:
则 sum( ) 的原型是什么样的呢?函数为何将行数(3)作为参数,而将列数(4)作为参数呢?
Data 是一个数组名,该数组有 3 个元素。第一个元素本身是一个数组,有 4 个 int 值组成。因此 data 的类型是指向由 4 个 int 组成的数组的指针,因此正确的原型如下:
其中的括号是必不可少的,因为下面的声明将声明一个由 4 个指向 int 的指针组成的数组,而不是由一个指向由 4 个 int 组成的数组的指针;另外,函数参数不能是数组:
还有另外一种格式,这种格式与上述原型的含义完全相同,但可读性更强:
上述两个原型都指出,ar2 是指针而不是数组。还需注意的是,指针类型指出,它指向由 4 个 int 组成的数组。因此,指针类型指定了列数,这就是没有将列数作为独立的函数参数进行传递的原因。
由于指针类型指定了列数,因此 sum( ) 函数只能接受由 4 列组成的数组。但长度变量指定了行数,因此 sum( ) 对数组的行数没有限制:
由于参数 ar2 是指向数组的指针,那么我们如何在函数定义中使用它呢?最简单的方法是将 ar2 看作是一个二维数组的名称。下面是一个可行的函数定义:
同样,行数被传递给 size 参数,但无论是参数 ar2 的声明或是内部 for 循环中,列数都是固定的——4 列。
可以使用数组表示法的原因如下。由于 ar2 指向数组(它的元素是由 4 个 int 组成的数组)的第一个元素(元素 0),因此表达式 ar2 + r 指向编号为 r 的元素。因此 ar2[r]是编号为 r 的元素。由于该元素本身就是一个由 4 个 int 组成的数组,因此 ar2[r]是由 4 个 int 组成的数组的名称。将下标用于数组名将得到一个数组元素,因此 ar2[r][c]是由 4 个 int 组成的数组中的一个元素,是一个 int 值。必须对指针 ar2 执行两次解除引用,才能得到数据。最简单的方法是使用方括号两次:ar2[r][c]。然而,如果不考虑难看的话,也可以使用运算符*两次:
为理解这一点,读者可以从内向外解析各个子表达式的含义:
sum( ) 的代码在声明参数 ar2 时,没有使用 const,因为这种技术只能用于指向基本类型的指针,而 ar2 是指向指针的指针。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论