【发布时间】:2014-07-28 18:20:19
【问题描述】:
我去年做的一个项目涉及指针运算。当我这样做时,我能够将指针视为内存地址,并根据需要从它们中添加或减去。例如,如果 int* p == array[0],那么你会知道 p + sizeof(int) 会找到 array[1]。情况似乎不再如此,因为我面前有一个相对知名的面试问题,我必须在其中调试以下代码:
void
ReverseTheArray( const short *pArrayStart, int nArrayByteLength )
{
short const *pArrayEnd = (pArrayStart + nArrayByteLength);
while(pArrayStart != pArrayEnd)
{
short tmp = *pArrayStart;
*pArrayStart = *pArrayEnd;
*pArrayEnd = tmp;
pArrayStart++;
pArrayEnd--;
}
}
请注意最后两行 - 我敢打赌这些都是错误的,因为简单地向指针添加 1 是行不通的,您需要添加 sizeof(short)。但从测试代码看来我错了——“pArrayStart++”将 sizeof(short) 添加到指针,而不是 1。
这是什么时候改变的?谁能给我一些见解,让我知道我错在哪里,这样如果我被问到这个问题,我就不会显得愚蠢吗?
编辑: 好的 - 似乎一直都是这样。我的错。
【问题讨论】:
-
我相信指针算法在我的一生中都是如此。
-
p + sizeof(int)不会导致&array[1]。结果为&array[sizeof(int)]。从 C 的早期开始就是这样。 -
"例如,如果 int* p == array[0],那么你会知道 p + sizeof(int) 会找到 array[1]。" - 不,我不知道,因为这不是真的。 C++ 中的指针运算从未像您声称的那样有效。
标签: c++ pointers pointer-arithmetic