можно ли скопировать
MyStruct * const * array1
в
MyStruct * array1
но просто как мелкая копия? Мне нужно отсортировать и написать обратно, и я хочу изменения в массиве 1 тоже
РЕДАКТИРОВАТЬ: Я глуп, я упустил ** в массиве 1, то это имеет смысл.
Я предполагаю, что вы имеете в виду const MyStruct * array1?
В любом случае вы можете использовать const_cast для изменения константности указателя:
const MyStruct * array1;
MyStruct * array2 = const_cast<MyStruct *>(array1);
Или же
const MyStruct * const array1;
MyStruct * array2 = const_cast<MyStruct *>(array1);
Точно работает структура из вопроса … Но, второй array1
заменен другим указателем parray
,
Может быть, вы квалифицируете это как глубокую копию, даже если это поверхностная копия структуры?
Тогда, может быть, другой ответ лучше.
struct 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); * / удалить parray; }
Изменить: второй пример, как обсуждалось в комментариях к этому ответу.
Здесь у нас есть неконстантный указатель, которому мы последовательно присваиваем значения указателя из константного указателя-указателя 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 должны быть скопированы в неконстантный массив, где они могут быть переупорядочены и объекты могут быть изменены.
#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