Const указатели мелкой копии

можно ли скопировать

MyStruct * const * array1

в

MyStruct * array1

но просто как мелкая копия? Мне нужно отсортировать и написать обратно, и я хочу изменения в массиве 1 тоже

РЕДАКТИРОВАТЬ: Я глуп, я упустил ** в массиве 1, то это имеет смысл.

0

Решение

Я предполагаю, что вы имеете в виду const MyStruct * array1?

В любом случае вы можете использовать const_cast для изменения константности указателя:

const MyStruct * array1;
MyStruct * array2 = const_cast<MyStruct *>(array1);

Или же

const MyStruct * const array1;
MyStruct * array2 = const_cast<MyStruct *>(array1);
0

Другие решения

Точно работает структура из вопроса … Но, второй 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
0

По вопросам рекламы [email protected]