In general a buffer is simply a temporary storage place for data before it is processed. Most buffers act just like a queue, that is "first in, first out" (FIFO). The way this is actually accomplished depends on the implementation.
Some buffers are created using linked lists. This offers the most flexability, but it uses more memory.
If a large block of memory is reserved as the buffer (such as an array) then a strict FIFO implementation would be quite slow because memory would have to be shifted each time data is added to the buffer.
The solution that you describe would be more complex but would be much faster than the strict FIFO implementation and use less memory than the linked list.
Let me know if you have any questions or would like some code examples.