Приведение указателя к массиву (int* to int[2])
Как мне привести или преобразовать int* в int[x]?
В качестве примера я попытался привести указатель int* c = new int[x] к массиву int b[2]
int b[2] = { 2, 3 };
int* c = new int[b[1]];
c[0] = b[0];
c[1] = b[1];
c[2] = a;
Во-первых, я знаю, что я могу перебирать указатель и массив. Таким образом, преобразуйте указатель в массив с помощью операторов [] для индексации указателя и массива, назначая элементы указателя элементам массива по мере выполнения итерации (например. arr[i] = p[i]). Я хочу знать, может ли тот же результат быть достигнут в меньшем количестве строк кода.
Я попытался это понять. я сделал быструю программу, чтобы убедиться, что точно знаю, что я пытаюсь поместить и где. Выходные данные приведены чуть ниже:
Address of {type: int} &a = 0031FEF4; a = 1
Address of {type: int[2]} &b = 0031FEE4; b = 0031FEE4
Address of {type: int[2]} &b[0] = 0031FEE4; b[0] = 2
Address of {type: int[2]} &b[1] = 0031FEE8; b[1] = 3
Address of {type: int*} &c = 0031FED8; c = 008428C8
Address of {type: int*} &c[0] = 008428C8; c[0] = 2
Address of {type: int*} &c[2] = 008428D0; c[2] = 1
Как только я убедился, что знаю, где находится, я попробовал несколько вещей. Первая идея, которая пришла в голову, состояла в том, чтобы получить адрес второго элемента для выделения указателя, а затем заменить им адрес памяти массива (см. код чуть ниже). Все, что я делал, в конечном счете терпело неудачу, обычно с синтаксическими ошибками.
Вот что я хочу сказать. пытался.Я очень хочу, чтобы это сработало, так как это было бы самым простым решением.
b = &c[1];
Это не работает, очевидно.
Редактировать: Решение:
Не делай этого!
Если это необходимо создать указатель на массив, а затем указать на массив; это бессмысленно для любых целей, которые я могу понять.
Более подробную информацию смотрите в ответе Родриго ниже.
2 ответов:
Прежде всего
b- это массив, а не указатель, поэтому он не может быть присвоен.Кроме того, вы не можете привести что-либо к типу массива. Однако вы можете привести указатель к массиву. Обратите внимание, что в C и C++ указатели на массивы встречаются довольно редко. Почти всегда лучше использовать простые указатели или указатели на указатели и избегать указателей на массивы.
В любом случае, то, что вы просите, можно сделать, более или менее:
int (*c)[2] = (int(*)[2])new int[2];Но a
typedefсделает это проще:typedef int ai[2]; ai *c = (ai*)new int[2];И чтобы быть в безопасности, удаление должно производиться с использованием исходного типа:
delete [](int*)c;Что хорошо, если вы делаете это просто для удовольствия. Для реальной жизни обычно лучше использовать
std::vector.
Для индексирования массива с помощью указателя:
Обратите внимание, что это не кастинг, но часто Это самый простой способ сделать то, что вам действительно нужно.int* arr; int x = arr[2]; // Pointers can be subscripted
Comments