在* ptr1 ++ = * ptr2 ++之后按索引访问

时间:2012-02-20 14:56:36

标签: c++ pointers

这就是我的代码的样子:

int main()
{
    int a[] = {1,23,5,56,7,5};
    int *p2 = a;
    size = sizeof(a)/sizeof(a[0]);
    int *p1 = new int[size];

    cout << "sizeof " << size << endl;
    int i = 0;
    while(p2 != a+size )
    {
        *p1++ = *p2++;
    }
    cout << p1[1] << ' ' << p1[3];
    return 0;
}

cout << p1[1] << ' ' << p1[3];输出的值与[1]和[3]中的值不同。任何人都可以解释为什么会这样吗?

4 个答案:

答案 0 :(得分:4)

您的while循环会修改p1。循环完成后,p1将指向新数组的结尾(事实上,它将指向结束后的下一个位置)。要解决此问题,请保留原始p1的副本。

int *p = p1;
while(p2 != a+size )
{
    *p1++ = *p2++;
}
p1 = p;
cout << p1[1] << ' ' << p1[3];

答案 1 :(得分:3)

您需要将p1重置为初始数组的开头。

答案 2 :(得分:1)

在循环之后,p1指向分配缓冲区的末尾,而不是在开始时,因为在每次迭代中它都会递增。

你应该尝试这样的事情:

int *p1 = new int[size];

int *begin = p1; //store the beginning of the array
while(p2 != a+size )
{
    *p1++ = *p2++;
}
p1 = begin; //reset to the begin again

//now print!
cout << p1[1] << ' ' << p1[3];

答案 3 :(得分:1)

您应该在访问元素之前重置p1:

int main()
{
  int a[] = {1,23,5,56,7,5};
  int *p2 = a;
  int size = sizeof(a)/sizeof(a[0]);
  int *p1 = new int[size];

  cout << "sizeof " << size << endl;
  int i = 0;
  while(p2 != a+size )
  {
     *p1++ = *p2++;
  }
  p1 -= size;
  cout << p1[1] << ' ' << p1[3];
  return 0;
}