можно скопировать
MyStruct * const * array1
в
MyStruct * array1
но как мелкая копия? Мне нужно отсортировать его и записать обратно в него, и я хочу, чтобы изменения в массиве 1 тоже
EDIT: Im глупо, я упустил ** в array1, тогда это имеет смысл.
Наверное, вы имеете в виду 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; /* This is essentially the same as (*parray) = *(*array1); */ delete parray; }
Изменение: второй пример, как описано в комментариях к этому ответу. Здесь у нас есть неконстантный указатель, которому мы последовательно присваиваем значения указателя из array1
-указателя-указателя 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
MyStruct*const
, а не оconst MyStruct*
.const_cast<>
совершенно не нужен.