Указатель на массив указателей - PullRequest
13 голосов
/ 26 мая 2011

У меня есть массив указателей int int* arr[MAX];, и я хочу сохранить его адрес в другой переменной. Как определить указатель на массив указателей? i.e.:

int* arr[MAX];
int (what here?) val = &arr;

Ответы [ 6 ]

23 голосов
/ 26 мая 2011

Правильный ответ:

int* arr[MAX];
int* (*pArr)[MAX] = &arr;

Или просто:

        int* arr  [MAX];
typedef int* arr_t[MAX];

arr_t* pArr = &arr;

Последняя часть читается как «pArr - указатель на массив элементов MAX типа указатель на int».

В C размер массива хранится в типе, а не в значении.Если вы хотите, чтобы этот указатель правильно обрабатывал арифметику указателей на массивах (в случае, если вы хотите создать из них двумерный массив и использовать этот указатель для его итерации), вы - часто, к сожалению,- необходимо, чтобы размер массива был встроен в тип указателя.

К счастью, поскольку C99 и VLA (может быть, даже раньше, чем C99?), MAX можно указывать во время выполнения, а не во время компиляции.1015 *

15 голосов
/ 26 мая 2011

Должно быть просто:

int* array[SIZE];
int** val = array;  

Нет необходимости использовать оператор адреса в array, поскольку массивы распадаются на неявные указатели справа от оператора присваивания.

1 голос
/ 26 мая 2011

IIRC, массивы неявно преобразуются в указатели, поэтому это будет:

int ** val = arr;
0 голосов
/ 10 октября 2016

Я считаю, что ответ прост:

int **val;<br>
val = arr;
0 голосов
/ 25 сентября 2016

Согласно этому источнику http://unixwiz.net/techtips/reading-cdecl.html,, используя правило "идите направо, когда можете, идите налево, когда вы должны", мы получаем следующие 2 значения объявлений, приведенных в предыдущих ответах -

int **val ==> val is a pointer to pointer to int
int* (*pArr)[MAX] ==> pArr is a pointer to an array of MAX length pointers to int.

Я надеюсь, что приведенные выше значения имеют смысл, и если они этого не делают, вероятно, было бы неплохо изучить вышеупомянутый источник.

Теперь должно быть ясно, что второе объявление являетсятот, который ищет moteutsch, так как объявляет указатель на массив указателей.

Так почему же работает и первый?Помните, что

int* arr[MAX]

- это массив целых указателей .Итак, val - это указатель на первый указатель на int, объявленный внутри массива указателей на int.

0 голосов
/ 26 мая 2011

Насколько я знаю, в c нет определенного типа "массив целых чисел", поэтому на него невозможно указать конкретный указатель.Единственное, что вы можете сделать, это использовать указатель на int: int*, но вы должны учитывать размер int и длину вашего массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...