【问题标题】:C++ pointer arithmetic logic [duplicate]C ++指针算术逻辑[重复]
【发布时间】: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


【解决方案1】:

指针的类型仅用于此目的。 “指向 int 的指针”表示加一个会跳过 4 个字节(如果该机器上的 int 是 4 个字节。

更新:(当然,除了解释它指向的是什么类型的数据)。

【讨论】:

  • 不,提供大小信息并不是具有引用类型的指针的唯一目的。
  • Emm 我应该写“除了告诉它指向什么类型的数据”会添加。但这里的重点是,指针的类型是告诉你它会跳过多少字节的唯一信息来源
猜你喜欢
  • 2014-10-09
  • 1970-01-01
  • 2012-07-27
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多