数组边界和索引

时间:2010-02-11 22:28:57

标签: c++ arrays pointers

我有一篇较早的帖子link text,有人说我把我的指针初始化为错误的元素,我不明白为什么,除了他们是正确的,它适用于他们的纠正。所以这是基本问题:

如果我使用

声明一个0到30之间的数组
#define ENDPOINT 15
int record[2 * ENDPOINT + 1];
// and want a pointer to be at the middle of the array, so 0 is at the middle, and
// +15 is at 30, and -15 is at 0
// why is int *ptr = &record[ENDPOINT + 1] wrong?  why is the correct declaration
int *ptr = &record[ENDPOINT];

因为如果我把ptr放在& record [ENDPOINT],这意味着记录数组中第15个条目是第14个索引,然后添加15将只有29个对吗?谢谢!

7 个答案:

答案 0 :(得分:6)

record[ENDPOINT]是第16个元素 - 数组的索引从0开始,因此record[0]是第1个元素,record[1]是第2个元素......和record[ENDPOINT](是record[15])是第16个元素。

您的数组中有2*15+1或31个元素。向ENDPOINT(15)添加14会产生29,而record[29]是数组中的第30个元素。 record[30]将是数组中的最后一个或第31个元素。

答案 1 :(得分:2)

  

因为如果我将ptr放在& record [ENDPOINT],这意味着记录数组中的第15个条目是第14个索引

不。

它表示record[15]处的条目 - 换句话说,即第15个索引。

答案 2 :(得分:2)

数组索引从零开始,因此record[ENDPOINT]是第15个索引,这是数组中的第16个记录。集[0,15](含)包含16个数字。

答案 3 :(得分:1)

基本上,如果你想指向你想要指向一个元素的确切中间位置 - 那就是定义中的+1。

这是一张图片:

123456789012345 x 543210987654321

由于数组基于0而不是基于1,因此您有:

012345678901234 x-1 432109876543210

答案 4 :(得分:1)

不,&record[ENDPOINT]表示第16个条目,因为&record[0]是第一个,&record[1]是第二个,依此类推。

答案 5 :(得分:1)

我的回复没有回答你的问题;相反,我想添加一个最佳实践。如果你正在搞乱数组索引,并且你真的不是100%肯定你是否正确使用VC ++ 2008或更高版本,请使用/ RTC1编译代码,这将执行运行时检查确保你正确访问数组边界。

基本上,如果运行时检测到你已经超出数组边界,那么你的应用程序将以一个很好的堆栈跟踪终止到违规代码。

这是一个救生员。相信我!

答案 6 :(得分:0)

Nope记录[30]表示正好30条记录,从0开始