コピーすることは可能ですか
MyStruct * const * array1
に
MyStruct * array1
しかし、浅いコピーとして?並べ替えて書き戻す必要があり、配列1にも変更が必要です
編集: 私は愚かです、私は ** を array1 で見落としていましたが、それは理にかなっています。
コピーすることは可能ですか
MyStruct * const * array1
に
MyStruct * array1
しかし、浅いコピーとして?並べ替えて書き戻す必要があり、配列1にも変更が必要です
編集: 私は愚かです、私は ** を array1 で見落としていましたが、それは理にかなっています。
質問の構造とまったく同じように機能します...しかし、2番目array1
は別のポインターに置き換えられましたparray
。
たぶん、構造体の浅いコピーであっても、これを深いコピーと見なしますか? それなら、おそらく、他の答えの方が良いでしょう。
構造体 MyStruct { int i; int* p; }; int j=2; MyStruct st={ 1, &j }; int main() { MyStruct* parray1(&st); MyStruct* const* array1(&parray1); MyStruct * parray=new MyStruct(); parray->i = (*array1)->i; parray->p = (*array1)->p; /* これは本質的には (*parray) = *(*array1); */ パレーを削除します。 }
編集:この回答へのコメントで説明されている2番目の例。ここでは、 const pointer-pointer からポインター値を連続して割り当てる非 const ポインターがありますarray1
。
#include <iostream>
struct MyStruct {
int i;
int* p;
};
int j=2;
MyStruct st1={ 1, &j }, st2={ 2, &j };
int main() {
MyStruct* parray1[2] = {&st1, &st2};
MyStruct* const *array1(parray1);
std::cout << array1[0]->i << ' ' << array1[1]->i << '\n';
MyStruct* parray=array1[0];
parray->i = 3;
parray=array1[1];
parray->i = 4;
std::cout << array1[0]->i << ' ' << array1[1]->i << '\n';
return 0;
}
対応する出力:
1 2
3 4
最後のコメント (私が思うに) の後、私たちは質問の共通の解釈に達しました。const 配列内のポインターは非 const 配列にコピーされ、そこで再配置してオブジェクトを変更できます。
#include <iostream>
#include <algorithm>
struct MyStruct {
int i;
int* p;
};
int j=2;
MyStruct st1={ 1, &j }, st2={ 2, &j };
int main() {
MyStruct* parray1[2] = {&st1, &st2};
MyStruct* const *array1(parray1);
std::cout << array1[0]->i << ' ' << array1[1]->i << '\n';
MyStruct* parray[2];
std::copy(array1,array1+sizeof(parray)/sizeof(parray[0]),parray);
// some manipulation:
std::swap(parray[0],parray[1]);
parray[0]->i = 3;
parray[1]->i = 4;
std::cout << array1[0]->i << ' ' << array1[1]->i << '\n';
return 0;
}
新しい出力は次のとおりです。
1 2
4 3
const MyStruct * array1 のことだと思いますか?
いずれの場合でも、 const_cast を使用してポインターの constness を変更できます。
const MyStruct * array1;
MyStruct * array2 = const_cast<MyStruct *>(array1);
または
const MyStruct * const array1;
MyStruct * array2 = const_cast<MyStruct *>(array1);