Так же, как разъяснение того, что упомянули несколько человек, - это:
buffer[0]
эквивалентно
*(buffer + 0*sizeof(char))
Это технически неверно, если вы предполагаете, что это буквальный код C (т.е. не псевдокод), хотя это то, что компилятор делает для вас.
Из-за арифметики с указателями, когда вы добавляете целое число к указателю, оно автоматически умножается на sizeof(*pointer)
, поэтому оно должно быть действительно:
*(buffer + 0)
Хотя, поскольку sizeof(char)
определено как 1, в данном случае оно фактически эквивалентно.