我有一篇较早的帖子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个对吗?谢谢!
答案 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开始