Если добавить 0
к a
, то a
сначала преобразуется в значение указателя типа int(*)[2]
(указывающее на первый элемент массива типа int[3][2]
).Затем к этому добавляется 0
, что добавляет 0 * sizeof(int[2])
байтов к адресу, представленному этим значением указателя.Так как это умножение дает 0, оно даст то же значение указателя.Поскольку это указатель, sizeof(a+0)
возвращает размер указателя, который составляет 8 байтов на вашем ящике.
Если вы выполните sizeof(a)
, у компилятора нет оснований преобразовывать a
в значение указателя (это имеет смысл, только если вы хотите индексировать элементы или выполнять арифметику указателей, включающую адресэлементы).Таким образом, выражение a
остается типом массива, и вы получаете размер int[3][2]
вместо размера int(*)[2]
.Итак, 3 * 2 * sizeof(int)
, что на вашем боксе 24 байта.
Надеюсь, это прояснит ситуацию.