0

コピーすることは可能ですか

MyStruct * const * array1

MyStruct * array1

しかし、浅いコピーとして?並べ替えて書き戻す必要があり、配列1にも変更が必要です

編集: 私は愚かです、私は ** を array1 で見落としていましたが、それは理にかなっています。

4

2 に答える 2

0

質問の構造とまったく同じように機能します...しかし、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
于 2013-10-26T07:42:26.943 に答える
0

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);
于 2013-10-26T07:37:04.907 に答える