У меня есть этот код - http://ideone.com/wslBnj
#include <stdio.h>
int main(void) {
int array[2][3] = {5,10,15,20,25,30};
int (*ptr)[2][3] = &array; // line 1
printf("%d\n",***ptr);
printf("%d\n",*(*ptr)[1]);// line 2
printf("%d\n",(*ptr)[1][2]);
return 0;
}
Я не понимаю синтаксис LHS (слева) в строке 1. Что это значит (на словах)?
Я не понимаю приоритет, указанный в строке 2. Я имею в виду, что выход может быть для (*(*ptr))[1]
этой группировки, но это было для этого *((*ptr)[1])
. Почему это?
Может кто-нибудь объяснить оба сомнения в деталях? Я не мог понять поисковые запросы для поиска этого вопроса в Интернете. Вот почему я спрашиваю его прямо здесь.
Эта строка
int (*ptr)[2][3] = &array; // line 1
объявляет указатель ( *ptr )
объекту типа int [2] [3] То есть это указатель на двумерный массив типа int [2] [3]
Если вы не будете использовать круглые скобки
int * ptr[2][3];
то объявление будет означать двумерный массив указателей типа int *
В выражении # 2
*(*ptr)[1]
оценивается в следующем порядке.
1. ( *ptr )
Поскольку ptr объявлен как указатель на два димемационных массива, то разыменование указателя даст объект, на который указывает указатель. Итак, (* ptr) означает массив
int array[2][3]
2. ( *ptr )[1]
является ссылкой на вторую строку массива
и, наконец, в этом выражении
3. *( *ptr )[1]
массив (* ptr) [1], который является второй строкой массива "array", преобразуется в указатель на его первый элемент, и этот указатель разыменовывается. Итак, как результат *( *ptr )[1]
первый элемент второй строки массива "массив", то есть вы получите 20.
Оператор *, который является унарным оператором, имеет более низкий приоритет, чем оператор [], и оценивается справа налево.
Из стандарта C++
5.3 Унарные выражения
1 Выражения с унарной группой операторов справа налево.
Таким образом, если вы напишете для выражения массива "array"
**array
то сначала оценивается *array
подвыражения *array
, который даст ссылку на первую строку массива, а затем *( *array )
даст первый элемент первой строки.
Я не понимаю синтаксис LHS (слева) в строке 1. Что это значит (на словах)?
В C декларации следуют за использованием. Это означает, что (*ptr)[2][3]
имеет тип int
(ну, технически, [2] [3] будет за пределами, но вы получите точку). В любом случае, это означает, что (*ptr)
является многомерным массивом ints, а именно массивом 2x3 ints. Следовательно, ptr
является указателем на массив [2] [3] из ints.
Я не понимаю приоритет, указанный в строке 2. Я имею в виду, что выход может быть для (* (* ptr)) [1] этой группировки, но это было для этого * ((* ptr) [1]). Почему это?
Индексирование имеет более высокий приоритет, чем разыменование. Таким образом, *(*ptr)[1]
эквивалентно *((*ptr)[1])
, и в этом случае он эквивалентен (*ptr)[1][0]
, так как (*ptr)[1]
представляет собой массив из 3 целых чисел.
int (* ptr) [2] [3] также может означать указатель на первую матрицу [2] [3] в 3d-массиве, например:
int array[2][2][3] = {{{4,8,12},{8,16,24}},{{5,10,15},{20,25,30}}};
int (*ptr)[2][3] = array; // note &array is not used here