设为首页 加入收藏

TOP

3.5.2 访问数组元素
2013-10-07 16:28:25 来源: 作者: 【 】 浏览:125
Tags:3.5.2 访问 元素

3.5.2  访问数组元素

与标准库类型vector和string一样,数组的元素也能使用范围for语句或下标运算符来访问。数组的索引从0开始,以一个包含10个元素的数组为例,它的索引从0到9,而非从1到10。

在使用数组下标的时候,通常将其定义为size_t类型。size_t是一种机器相关的无符号类型,它被设计得足够大以便能表示内存中任意对象的大小。在cstddef头文件中定义了size_t类型,这个文件是C标准库stddef.h头文件的C++(www.cppentry.com)语言版本。

数组除了大小固定这一特点外,其他用法与vector基本类似。例如,可以用数组来记录各分数段的成绩个数,从而实现与3.3.3节(第104页)的程序一样的功能:

  1. // 以10分为一个分数段统计成绩的数量: 0--9, 10--19, …, 90--99, 100  
  2. unsigned scores[11] = {}; // 11 个分数段,全部初始化为0  
  3. unsigned grade;  
  4. while (cin >> grade) {  
  5.     if (grade <= 100)  
  6.         ++scores[grade/10]; // 将当前分数段的计数值加1  

与104页的程序相比,上面程序最大的不同是scores的声明。这里scores是一个含有11个无符号元素的数组。另外一处不太明显的区别是,本例所用的下标运算符是由C++(www.cppentry.com)语言直接定义的,这个运算符能用在数组类型的运算对象上。104页的那个程序所用的下标运算符是库模板vector定义的,只能用于vector类型的运算对象。

与vector和string一样,当需要遍历数组的所有元素时,最好的办法也是使用范围for语句。例如,下面的程序输出所有的scores:
 

  1. for (auto i : scores)   // 对于scores中的每个计数值  
  2.       cout << i << " ";         // 输出当前的计数值  
  3. cout << endl

因为维度是数组类型的一部分,所以系统知道数组scores中有多少个元素,使用范围for语句可以减轻人为控制遍历过程的负担。

检查下标的值

与vector和string一样,数组的下标是否在合理范围之内由程序员负责检查,所谓合理就是说下标应该大于等于0而且小于数组的大小。要想防止数组下标越界,除了小心谨慎注意细节以及对代码进行彻底的测试之外,没有其他好办法。对于一个程序来说,即使顺利通过编译并执行,也不能肯定它不包含此类致命的错误。

大多数常见的安全问题都源于缓冲区溢出错误。当数组或其他类似数据结构的下标越界并试图访问非法内存区域时,就会产生此类错误。

3.5.2节练习

练习3.30:指出下面代码中的索引错误。

  1. constexpr size_t array_size = 10;  
  2. int ia[array_size];  
  3. for (size_t ix = 1; ix <= array_size; ++ix)  
  4.   ia[ix] = ix;  

练习3.31:编写一段程序,定义一个含有10个int的数组,令每个元素的值就是其下标值。

练习3.32:将上一题刚刚创建的数组拷贝给另外一个数组。利用vector重写程序,实现类似的功能。

练习3.33:对于116页的程序来说,如果不初始化scores将发生什么?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇3.5.1 定义和初始化内置数组 下一篇3.5.3 指针和数组(1)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: