Если у меня есть массив, объявленный так:
int a[3][2];
хранится по адресу A.
A
Тогда + 1 равно A+2*4, это для меня ясно, но почему &a+1 равно A+6*4?
A+2*4
&a+1
A+6*4
a - это массив int[2].Который имеет размер 2 * sizeof(int).Вот почему a + 1 = A + 2*4.(поскольку sizeof(int) = 4 в вашем случае)
a
int[2]
2 * sizeof(int)
a + 1 = A + 2*4
sizeof(int) = 4
Однако, &a является указателем на int[3][2].Поскольку sizeof(int[3][2]) = 6 * sizeof(int), следовательно: &a + 1 = A + 6*4
&a
int[3][2]
sizeof(int[3][2]) = 6 * sizeof(int)
&a + 1 = A + 6*4
Тогда a + 1 равно A + 2 * 4
Это потому, что a уменьшается до int (*)[2], а +1 приводит к 2 * sizeof(int).
int (*)[2]
+1
но почему & a + 1 равно A + 6 * 4?
В этом случае &a возвращает int (*)[3][2], а +1 приводит к 2 * 3 * sizeof(int).
int (*)[3][2]
2 * 3 * sizeof(int)
Потому что оператор & имеет приоритет над оператором +.