C++教程之指向数组尾边界的内存
来源:互联网 发布:ubuntu卡在安装界面 编辑:程序博客网 时间:2024/06/03 20:31
翻译原文:
C++ Tutorial: The Do's and Don'ts of Accessing One Element Past the End of an Array
Danny Kalev
March 11, 2011
原文地址
介绍
直观上,安全的数组操作是不访问一个数组有效边界之外的元素。但是,有些场合,如遍历一个数组或者执行一系列元素操作的算法时,就有可能需要利用指向数组尾边界之外(译者注:数组尾边界之外的内存指的是数组尾部第一个访问非法地址)的内存。这有反于我们的常理,但C++的确允许这样的操作,但你使用的时候也必须非常小心,并且遵守一些重要的限制。
数组排序
利用指向数组尾边界之外内存地址的场合比你想象的要多。例如你有一个整型数组,你想通过std::sort算法来进行排序:
sort()函数要求两个前向迭代器(数组指针是有效的迭代器)作为参数:一个迭代器指向一系列元素的第一个,另一个则指向这个序列的最后。我们可以注意到,这里所指的 序列最后 并不是指向序列最后一个有效元素,也就是arr[4],而是数组尾边界之外内存地址:arr+5。任何对arr+5内存地址的解引用都会导致未定义的操作行为。但是,arr+5地址本身可有效地作为sort函数参数,完成排序操作。
有效与无效的操作
只要不对数组尾边界之外的内存地址进行读写,你就可以安全地利用这一特殊的地址指向。当然,你也不被允许对这一指针再进行增加操作。但是,你可以对这一指针在算术表达式中做减少操作或者在比较表达式中使用。如下例:
一般来说,arr+5只允许用来作为指针指向,不允许做解引用。
总结
在特定环境下,使用指向数组尾边界之外的内存是一种有效的操作。但你只能将它用在指针算术操作中访问数组有效元素或者用于比较表达式,不允许对该地址做解引用或者进一步增加操作。值得注意的是STL中非常频繁地使用这种惯用法。end()函数的作用就是返回一个指向这一特殊内存地址的迭代器。同样,你也只能将end()返回的结果用于指针算术操作访问有效元素与比较表达式。
- C++教程之指向数组尾边界的内存
- C语言之指向数组的指针
- c语言之指针(指向数组元素的指针与指向数组的指针)
- C语言学习笔记之指向数组元素的指针和指向数组的指针
- C 指向数组的指针
- c指向数组的指针数组
- 【C/C++】指向数组的指针
- new、delete、指向连续空间的指针、数组、空间释放、空间申请[C++][内存管理]
- new、delete、指向连续空间的指针、数组、空间释放、空间申请[C++][内存管理]
- C语言的指向数组的指针
- C和指针之指针数组和指向数组的指针
- C语言指向多维数组的指针
- C语言指向多维数组的指针
- C语言指向多维数组的指针
- C语言指向多维数组的指针
- c指向多维数组的指针
- C/C++指向二维数组的指针
- 内存篇之指向栈的指针
- 【初学设计模式】Flyweight (享元)
- Virtual Shard
- 用java代码实现native2ascii的功能
- Android资源管理——资源文件的创建、读取和管理
- 【初学设计模式】Proxy (代理)
- C++教程之指向数组尾边界的内存
- 多项式乘法
- 用ATMEL的FLIP下载程序后的串口通信
- 【绝对原创】BACnet MS/TP开发经验分享系列-001 工具篇
- 集合 List ArrayList LinkedList HashMap HashSet Iterator 迭代器
- Ext.util.JSON.decode 的用法
- Ubuntu Linux系统下Apt-get命令参数详解
- android连接mysql数据库
- Ubuntu: 登陆界面无法输入密码