0

私の質問が明確で関連性があり、ポインタが初めてであることを願っています...-コピーを開始したい配列の最初のスロットの場所へのポインタを参照して、配列の全体を一度にコピーできますか?

例-配列が与えられた場合:A[1,2,3,4,5,7,8,3,2,5,1,0,9]-配列の一部のみをn'からコピーしたい配列Bの先頭にあるスロットオン[000 .....](BはAと同じ長さです)。

ループの代わりにポインターを使用して、一度にそれを行うことはできますか?のようなもの-Aのn番目のスロットへのポインタでBの1番目のスロットへのポインタを切り替え、Aの最後のスロットでBのn番目のスロットへのポインタを切り替えますか?

よろしくお願いします!

4

2 に答える 2

6

それmemcpyが目的です。

memcpy(B, A + n, (N - n) * sizeof(A[0]));

ここNで、はの要素の数ですAAが実際に配列である場合(1つへのポインタだけでなく)、として計算Nできるため、呼び出しは次のように簡略化されます。sizeof(A) / sizeof(A[0])

memcpy(B, A + n, sizeof(A) - n * sizeof(A[0]));

memcpyに住んでい<string.h>ます; 最初の引数はコピーの宛先であり、2番目の引数はソースです。

(申し訳ありませんが、私はあなたがどのようなポインタートリックを考えているのか実際にはフォローしていないので、それについてコメントすることはできません。)

于 2012-10-28T12:47:20.640 に答える
0

私はあなたが何を求めているのか理解していると思います。ポインタを使用して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];
于 2012-10-28T13:05:41.103 に答える