Указатель каста на массив (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];
Это не сработало, очевидно.
Изменение: Решение: не делай этого! Если необходимо, создайте указатель на массив, а затем укажите на массив; это бессмысленно для любых целей, которые я могу понять. Для более подробной информации смотрите ответ по Родриго ниже.
Ответы
Ответ 1
Прежде всего b
- это массив, а не указатель, поэтому он не может быть назначен.
Кроме того, вы не можете ничего отличить от типа массива. Тем не менее, вы можете переключить на указатель на массив.
Обратите внимание, что в 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
.
Ответ 2
Прежде всего, приведение указателя к массиву в стиле C - это очень плохая практика в целом.
Но вы можете разложить временный массив ("массив значений") на адрес/указатель. Просто напишите что-нибудь подобное
#include <stdio.h>
int main()
{
int *array = (int[2]){1, 2};
printf("%d", array[0]); /* array[0] contains 1 now */
return 0;
}
Хотя я еще раз подчеркиваю: когда вы делаете это, у вас должны быть веские причины для подобных уловок.
PS Код, указанный выше, действителен только для C99/C11, но не для современных C++ компиляторов.
Ответ 3
Чтобы индексировать массив с помощью указателя:
int* arr;
int x = arr[2]; // Pointers can be subscripted
Обратите внимание, что это не кастинг, но часто это самый простой способ сделать то, что вам действительно нужно.