Массивы в C всегда передаются по ссылке, вы не передаете их в качестве аргумента функции! (Это первый урок для начинающих C программистов)
Сначала прочитайте кое-что об указателях в C, но вкратце:
int a = 5; // declares a integer-type of value 5
int* pta; // declares a pointer-to-integer type
pta = &a // assigns the **address** of a to pta (e.g. 0x01)
int b = *pta // assingns the **value** of the address location that pta is pointing to into b
// (i.e. the contents of memory address 0x01, which is 5)
*pta = 4 // assigns 4 to the content of the memory address that pta is pointing to.
// now b is 5, because we assigned the value of the address that pta was pointing to
// and a is 4, because we changed the value of the address that pta was pointing to
// - which was the address where variable a was stored
Переменная bufferA
сама по себе является указателем на адрес первого элемента. bufferA + 1
дает вам адрес второго элемента, потому что массивы хранятся в памяти последовательно.
Или, если вы хотите более читаемый формат:
&bufferA[0] is the same as bufferA (address of the first element(e.g 0x11)
&bufferA[1] is the same as bufferA + 1 (address of the second element(e.g 0x12)
buffer[2] is the same as *(buffer + 2) (value at the address of the third element)