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

Недопустимый вывод в массиве `int`

Я пытаюсь выучить указатели, и я просто столкнулся с ситуацией, которую я не понимаю.

int main()
{
  int num[3][2]={3,6,9,12,15,18};
  printf("%d %d",*(num+1)[1],**(num+2));
}

В соответствии с тем, что я узнал, выход должен быть:

12 15

но на самом деле это:

15 15

Почему? Просьба пояснить, как все вычисляется здесь, так как, по моему мнению, сначала *(num+1) вычисляется и указывает на 1-й, т.е. {9,12}, а затем [1] следует разыгрывать первый элемент i.e 12.

Я использую компилятор GCC.

4b9b3361

Ответ 1

См. Приоритет оператора C, [] обрабатывается до *

Это означает

(num+1)[1]
*((num+1)+1)
*(num+2)

Вместе с дополнительным * (не написанным в моем примере),
он становится таким же, как и второе.

Ответ 2

В ваших данных

int num[3][2]={3,6,9,12,15,18};

эквивалентно:

int num[3][2]={{3,6},{9,12},{15,18}};

то есть.

num[0][0] = 3
num[0][1] = 6
num[1][0] = 9
num[1][1] = 12
num[2][0] = 15
num[2][1] = 18

таким образом,

*(num+1)[1]
= *(*(num+1+1))
= num[2][0] 
=15

и

**(num+2))
= num[2][0]
=15

Ответ 3

Оператор нижнего индекса массива [] имеет более высокий приоритет, чем оператор разыменования *.

Это означает, что выражение *(num+1)[1] эквивалентно *((num+1)[1])

И если мы разделим его

*(*((num+1)+1))

*(*(num+2))

*(num[2])

num[2][0]