Ответ 1
См. Приоритет оператора C, []
обрабатывается до *
Это означает
(num+1)[1]
*((num+1)+1)
*(num+2)
Вместе с дополнительным *
(не написанным в моем примере),
он становится таким же, как и второе.
Я пытаюсь выучить указатели, и я просто столкнулся с ситуацией, которую я не понимаю.
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.
См. Приоритет оператора C, []
обрабатывается до *
Это означает
(num+1)[1]
*((num+1)+1)
*(num+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
Оператор нижнего индекса массива []
имеет более высокий приоритет, чем оператор разыменования *
.
Это означает, что выражение *(num+1)[1]
эквивалентно *((num+1)[1])
И если мы разделим его
*(*((num+1)+1))
*(*(num+2))
*(num[2])
num[2][0]