Не могу понять синтаксис и приоритет

0

У меня есть этот код - 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]). Почему это?

Может кто-нибудь объяснить оба сомнения в деталях? Я не мог понять поисковые запросы для поиска этого вопроса в Интернете. Вот почему я спрашиваю его прямо здесь.

  • 0
    Может быть полезно, по крайней мере, для некоторых сомнений: cdecl.org
  • 1
    эта строка: int array [2] [3] = {5,10,15,20,25,30}; плохо написано, так как результаты строки / столбца определяются реализацией. лучше использовать: int array [2] [3] = {{5,10,15}, {20,25,30}};
Теги:
output
syntax

3 ответа

3

Эта строка

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 ) даст первый элемент первой строки.

3

Я не понимаю синтаксис 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 целых чисел.

1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню