在c++中,如何仅使用指针将每个元素向右移动1

In C++, how can one move each element one to the right using only pointers?

本文关键字:元素 右移 移动 指针 c++ 何仅使      更新时间:2023-10-16

例如,这个数组例如,[1,2,3,4,5]将变成这个数组[5,1,2,3,4]

这是我想出来的,但它不起作用:

 int  *ptr = arr; //initialize to first element
    int  *ptr2 = arr+1; //initialize it to second element
   while (n >0) // keep doing it until size is done with
   {
       *ptr2 = *ptr; 
       ++ptr2;
       ptr ++;
       n--;//
   }

"只使用指针"是一个相当模糊的要求。下面的现代解决方案在某种程度上也使用了"仅指针",因为std::rotate操作的是迭代器,指针迭代器:

#include <algorithm>
#include <iostream>
int main()
{
    int arr[] = { 1, 2, 3, 4, 5 };
    using std::begin;
    using std::end;
    std::rotate(begin(arr), end(arr) - 1, end(arr));
    for (auto&& element : arr)
    {
        std::cout << element << "n";
    }
}

但是我觉得给你这个作业的老师会因为某种原因不高兴。至于你的解决方案:

 int  *ptr = arr; //initialize to first element
    int  *ptr2 = arr+1; //initialize it to second element
   while (n >0) // keep doing it until size is done with
   {
       *ptr2 = *ptr; 
       ++ptr2;
       ptr ++;
       n--;//
   }

(我将假设你的n在循环开始之前是4,因为否则你将有超过4次迭代,并在最后一次中遇到未定义的行为。)

循环的第一次迭代中:

  • arr[1]变为arr[0]
  • ptr2指向arr[2]
  • ptr指向arr[1]

首次迭代后的数组: [1, 1, 3, 4, 5]

可以看到,此时包含值2的元素已经丢失了。

在循环的第二次迭代中:

  • arr[2]变为arr[1]
  • ptr2指向arr[3]
  • ptr指向arr[2]

数组第二次迭代后: [1, 1, 1, 4, 5]

现在包含值3的元素也丢失了。模式现在很清晰;你"丢失"了所有的元素,只是用1覆盖了所有的元素。

必须找到一种方法来保存要覆盖的元素。或者最好直接使用std::rotate

*ptr2 = *ptr;处,您已经丢失了关于第二个元素初始值的信息。

我希望这能让你明白为什么你目前的方法行不通。

我假设n是数组的大小。如果是,可以使用以下代码:

int tmp = arr[n - 1];          /* Store the last element in `tmp` */
for(int i = n - 1; i > 0; i--) /* Loop backwards */
    arr[i] = arr[i - 1];       /* Move all elements up */
arr[0] = tmp;                  /* Insert the last element at the first location */