私はあなたが何を求めているのか理解していると思います。ポインタを使用して2番目の配列を設定できますが、そのようにすると問題が発生します。
int [] primary = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int * secondary = primary + 5;
この時点で、プライマリは{1、2、3、4、5、6、7、8、9、0}であり、セカンダリは{1、2、3、4、5、6、7、8、9、0}ですが、問題は両方がポイントであるということです。メモリ内の同じ配列に。したがって、2つの独立したコピーを作成する代わりに、「secondary」の要素のいずれかを編集すると、それらは「primary」でも編集されます。
secondary[2] = 10;
for(int i = 0; i < 10; ++i)
cout << primary[i] << ' ';
コードのこの部分は、次のようになります。1 2 3 4 5 6 7 10 9 0
これを行う正しい方法は、新しい配列を設定し、値をコピーしてループするか、memcpy()を使用することです。
編集:
//Rotate an array such that the index value is moved to the front of the array
null rotateArray( &int original[], int size, int index)
{
int * secondary = new int[size]; //dynamically allocated array
for(int i = 0; i < size; ++i)
{
secondary[i] = original[(i+index)%size];
}
original = secondary; //Move the original array's pointer to the new memory location
}
いくつかのメモ:
secondary[i] = original[(i+index)%size];
これが私が配列を回転させた方法です。サイズ5の元の配列があり、4番目の要素を新しい開始点にしたいとします(要素には0-(サイズ-1)の番号が付けられていることに注意してください)。
i = 0;
セカンダリ[0]=オリジナル[(0 + 3)%5]//=オリジナル[3]
i = 1;
セカンダリ[1]=オリジナル[(1+ 3)%5]//=オリジナル[4]
i = 2;
セカンダリ[2]=オリジナル[(2 + 3)%5]//=オリジナル[0]
..。
コードの最後の部分:
original = secondary;
関数が終了すると、c ++が使用済みメモリをクリーンアップしようとするかどうかを覚えていないため、少し疑問があります。これを行うためのより安全で100%確実な方法は、ループして2次配列の要素を元の配列にコピーすることです。
for(int i = 0; i < size; ++i)
original[i] = secondary[i];