#c #pointers #multidimensional-array
#c #указатели #многомерный массив
Вопрос:
Я понимаю, что существует множество вопросов о массивах и указателях, но у меня был один, который является чрезвычайно специфичным… На самом деле это из теста, который я недавно проходил в классе, и у меня все еще возникают проблемы с этим.
Вопрос в том — Выпишите полное объявление для
переменной с именем pmatrix, которая является указателем на массив из 8 массивов по 10 указателей на целые числа
пока я думаю о чем-то вроде
int * pmatrix[8][10] ,
больше интересует хорошее объяснение, чем просто ответ.
Спасибо!
Комментарии:
1. cdecl.org твой друг.
2. @Oli Спасибо за ссылку — очень круто!
Ответ №1:
Переменная с именем pmatrix, которая является указателем:
*pmatrix
к массиву из 8
(*pmatrix)[8]
массивы из 10
(*pmatrix)[8][10]
указатели на целые числа:
int *(*pmatrix)[8][10]
При замене в cdecl нам сообщают следующее:
объявите pmatrix как указатель на массив 8 из массива 10 указателя на int
с чего мы и начали!
Ответ №2:
int*pmatrix[8][10]
Существует проблема приоритета: []
имеет более высокий приоритет
чем ‘*’, так что это массив [8] из массива[10] указателя на
int
. Вам нужно добавить круглые скобки, чтобы переопределить приоритет:
int (*pmatrix)[8][10]
(Возможны дополнительные круглые скобки. Я не уверен, что
int (((*pmatrix)[8])[10]);
однако это было бы улучшением:-).)
Комментарии:
1. Все правильно, за исключением того, что это должны быть массивы указателей на
int
, а не простоint
.2. Упс. Но основной принцип остается в силе: спецификация типа ведет себя более или менее как выражения, и вам (иногда) нужны круглые скобки для обеспечения приоритета.
Ответ №3:
Ответ на ваш вопрос был бы
int* (*pmatrix)[8][10];
Помните, однако, что массивы — это просто указатели на первый элемент массива, поэтому массив — это указатель, а указатель — это массив (иногда состоящий только из одного элемента).
Обратите внимание, однако, что под этим массивом на самом деле находится всего лишь одномерный массив из 80 элементов. Если вы создаете индекс, подобный этому:
int pmatrix[8][10];
pmatrix[3][5];
Компилятор обрабатывает это так, как если бы вы сделали:
*(pmatrix (3 * 10) 5);
потому что индекс [3][5]
обращается к 5-му элементу ( 5) 3-го подмассива (3 * 10 (10 — это размер каждого подмассива)).
Комментарии:
1. -1: Нет, это не то же самое. Указатель на массив — это не то же самое, что массив.
2. @Oli Я никогда не говорил, что указатель на массив — это то же самое, что и массив, я сказал, что имя массива — это просто указатель на первый элемент массива. Пожалуйста, удалите свой отрицательный отзыв.
3. @Seth: В принципе, вы так и сделали, когда сказали, что это
int *pmatrix[8][10]
правильный ответ. Это неправильный ответ. Правильный ответint *(*pmatrix)[8][10]
.4. @Seth:
a
(inint a[5]
) является указателем не больше, чемb
находится вint b;
.5. @Seth: Это указатель, как семантически, так и скрыто. Случайно мы могли бы сказать, что это «указатель на массив» или даже просто «массив», но технически это неверно. Стандарты C / C четко указывают, что массив представляет собой что-то вроде
int a[5]
, и что результатомnew
(иmalloc
) является просто указатель на «выделенное пространство».
Ответ №4:
int** pmatrix = new int*[8]; // Array of 8 pointers to arrays
for(int i = 0; i < 8; i) pmatrix[i] = new int[10]; // Create each array