The concept of a buffer is not dependent on the language you're using. It's somewhere you put data temporarily; often it's used in some kind of streaming where the input and output data rates do not exactly match. For example in RS232 communications you might have lots of data to send from your program which can only be sent at a particular baud rate; the chances are your program would far exceed that rate if it tried to send the data directly. Also your program would have to become real-time so that it could send the data at exactly the right moment in time. So instead you write to a buffer, and the RS232 hardware reads from that buffer. It reads and sends while there is data in the buffer, and you store data into the buffer until (a) it's full or (b) you run out of data to send.

BUFFER EQU 1023000 is equivalent to char *buffer=1023000.

The difference between BUFFER and #BUFFER is that the latter takes the value 102300, because # (usually) means immediate value. The instruction MOVE A1,#BUFFER would set address register A1 to the value 1023000, but MOVE.B D1,(BUFFER) would read the first byte in the buffer, and MOVE.B (BUFFER),D1 would write the least significant byte of D1 to the buffer.

BUFFER+1024 would mean 1023000+1024, or 1024024, and that would be in bytes, not bits.