Если у Вас есть один одномерный массив как, например
int a[] = { 5, 6 };
то выражение a[1]
эквивалентно выражению *(a + 1)
и дает второй элемент массива, который равен 6
.
Массив a
из вашего примера
int a[4][2] = {1,2,3,4,5,6,7,8};
можно переписать следующим образом для ясности
int a[4][2] = { { 1,2 }, { 3,4 }, { 5,6 }, { 7,8 } };
Вы также можете ввести имя ЬурейеЕ для массива
typedef int T[2];
где наименование T
обозначает тип int[2]
.
С помощью этого ЬурейеЕ вы можете переписать декларацию (инициализация может быть опущен) из исходного массива следующим образом
T a[4];
Теперь давайте рассмотрим выражение *(*(a + 2)+1)
. Подвыражение *(a + 2)
эквивалентно a[2]
и, как объяснялось выше, даст третий элемент массива типа T
, где T имеет тип int[2]
. Таким образом, объектом этого подвыражения будет, в свою очередь, один размерный массив типа T
и соответствовать третьему элементу массива a
. Мы можем представить его как
T tmp = { 5,6 };
или
int tmp[2] = { 5,6 };
Таким образом, выражение *(*(a + 2)+1)
эквивалентно выражению *(tmp + 1)
, что эквивалентно tmp[1]
и даст второй элемент этого массива мыслимые TMP. То есть вы получите 6
.
Я считаю, что существует достаточно скобок, поэтому вам не следует путать с приоритетом. –
, что приводит к 'a [2] [1]'. – Jarod42
, если вы застряли с арифметикой указателя, просто не используйте его, но используйте простой 'a [2] [1]' вместо – user463035818