“仅使用指针”是一个相当模糊的要求。下面的现代解决方案在某种程度上也使用“仅指针”,因为std::rotate
对迭代器和指针进行操作are迭代器:
#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
.