Подтвердить что ты не робот

Указатель каста на массив (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];

Это не сработало, очевидно.

Изменение: Решение: не делай этого! Если необходимо, создайте указатель на массив, а затем укажите на массив; это бессмысленно для любых целей, которые я могу понять. Для более подробной информации смотрите ответ по Родриго ниже.

4b9b3361

Ответ 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

Обратите внимание, что это не кастинг, но часто это самый простой способ сделать то, что вам действительно нужно.